From a01dd66bea8aa2f5518a97a46dabd9c4173f3ea2 Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 14:50:23 +0300 Subject: [PATCH 01/20] Update README.md --- Source/Gapotchenko.FX.Text/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.Text/README.md b/Source/Gapotchenko.FX.Text/README.md index de5e9fd2..6960ffe6 100644 --- a/Source/Gapotchenko.FX.Text/README.md +++ b/Source/Gapotchenko.FX.Text/README.md @@ -37,7 +37,7 @@ if (name.Equals("[mscorlib]System.Object", StringComparison.Ordinal) || ``` It does the job but such mechanical changes may put a toll on code maintainability when they accumulate. -You can also spot some amount of code duplication there. +You can also spot some amount of code duplication here. Another approach would be to use `Regex` class which is readily available in .NET. But that might destroy the expressiveness of string manipulation functions like `Equals`. From 0813e7a414bd3b5055111c1309931e1a635f21c3 Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 14:51:03 +0300 Subject: [PATCH 02/20] Update README.md --- Source/Gapotchenko.FX.Diagnostics.CommandLine/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.Diagnostics.CommandLine/README.md b/Source/Gapotchenko.FX.Diagnostics.CommandLine/README.md index 8cb87c67..572d1e4a 100644 --- a/Source/Gapotchenko.FX.Diagnostics.CommandLine/README.md +++ b/Source/Gapotchenko.FX.Diagnostics.CommandLine/README.md @@ -94,7 +94,7 @@ The code above produces the following output: This is a neat departure from a traditional .NET convention where it always throws `ArgumentNullException`. Instead, Gapotchenko.FX uses a slightly different philosophy. -It does the best job possible under existing conditions by following common-sense expectations of a customer. +It does the best job possible under existing conditions by following common-sense expectations of a user. ### Split From 38c516b3beaf834b82da6d1691f32f97f6bf80ab Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 14:52:06 +0300 Subject: [PATCH 03/20] Update README.md --- Source/Gapotchenko.FX.Text/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.Text/README.md b/Source/Gapotchenko.FX.Text/README.md index 6960ffe6..4505d5e1 100644 --- a/Source/Gapotchenko.FX.Text/README.md +++ b/Source/Gapotchenko.FX.Text/README.md @@ -45,7 +45,7 @@ If a string function takes a `StringComparison` parameter then it may become a s That's why `Gapotchenko.FX.Text` module provides a set of so called regex trampoline functions. -They look exactly like `Equals`, `StartsWith`, `EndsWith`, `IndexOf` but work on regex patterns instead of raw strings. +They look exactly like `Equals`, `StartsWith`, `EndsWith`, `IndexOf` but work with regex patterns instead of raw strings. They also end with `Regex` suffix in their names, so `Equals` becomes `EqualsRegex`, `StartsWith` becomes `StartsWithRegex` and so on. This is how a regex trampoline can be used for the given sample in order to meet the new requirements by a single line change: From 4faf60f14b4b7b0a72b68b7ea97901b104bf09c1 Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 14:52:39 +0300 Subject: [PATCH 04/20] Update README.md --- Source/Gapotchenko.FX.Text/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.Text/README.md b/Source/Gapotchenko.FX.Text/README.md index 4505d5e1..9bf5ffd0 100644 --- a/Source/Gapotchenko.FX.Text/README.md +++ b/Source/Gapotchenko.FX.Text/README.md @@ -46,7 +46,7 @@ If a string function takes a `StringComparison` parameter then it may become a s That's why `Gapotchenko.FX.Text` module provides a set of so called regex trampoline functions. They look exactly like `Equals`, `StartsWith`, `EndsWith`, `IndexOf` but work with regex patterns instead of raw strings. -They also end with `Regex` suffix in their names, so `Equals` becomes `EqualsRegex`, `StartsWith` becomes `StartsWithRegex` and so on. +They also end with `Regex` suffix in their names, so `Equals` becomes `EqualsRegex`, `StartsWith` correspondingly becomes `StartsWithRegex` and so on. This is how a regex trampoline can be used for the given sample in order to meet the new requirements by a single line change: From ec5f9a5e83014be82798c8ac34b8e86ed42e9bb1 Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 14:52:53 +0300 Subject: [PATCH 05/20] Update README.md --- Source/Gapotchenko.FX.Text/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.Text/README.md b/Source/Gapotchenko.FX.Text/README.md index 9bf5ffd0..37e1cdd8 100644 --- a/Source/Gapotchenko.FX.Text/README.md +++ b/Source/Gapotchenko.FX.Text/README.md @@ -46,7 +46,7 @@ If a string function takes a `StringComparison` parameter then it may become a s That's why `Gapotchenko.FX.Text` module provides a set of so called regex trampoline functions. They look exactly like `Equals`, `StartsWith`, `EndsWith`, `IndexOf` but work with regex patterns instead of raw strings. -They also end with `Regex` suffix in their names, so `Equals` becomes `EqualsRegex`, `StartsWith` correspondingly becomes `StartsWithRegex` and so on. +They also end with `Regex` suffix in their names, so `Equals` becomes `EqualsRegex`, `StartsWith` correspondingly becomes `StartsWithRegex`, and so on. This is how a regex trampoline can be used for the given sample in order to meet the new requirements by a single line change: From 310665c920bd628e852093caab0bd5abc865226e Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 14:53:29 +0300 Subject: [PATCH 06/20] Update README.md --- Source/Gapotchenko.FX.Text/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.Text/README.md b/Source/Gapotchenko.FX.Text/README.md index 37e1cdd8..0c7b3000 100644 --- a/Source/Gapotchenko.FX.Text/README.md +++ b/Source/Gapotchenko.FX.Text/README.md @@ -48,7 +48,7 @@ That's why `Gapotchenko.FX.Text` module provides a set of so called regex trampo They look exactly like `Equals`, `StartsWith`, `EndsWith`, `IndexOf` but work with regex patterns instead of raw strings. They also end with `Regex` suffix in their names, so `Equals` becomes `EqualsRegex`, `StartsWith` correspondingly becomes `StartsWithRegex`, and so on. -This is how a regex trampoline can be used for the given sample in order to meet the new requirements by a single line change: +And this is how a regex trampoline can be used for the given sample in order to meet the new requirements by a single line change: ``` csharp using Gapotchenko.FX.Text.RegularExpressions; From 8885cb2bbc8d7f0ec981ff83298e580c7f93aaf3 Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 14:57:57 +0300 Subject: [PATCH 07/20] Update README.md --- Source/Gapotchenko.FX.Text/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/Gapotchenko.FX.Text/README.md b/Source/Gapotchenko.FX.Text/README.md index 0c7b3000..3a7cda14 100644 --- a/Source/Gapotchenko.FX.Text/README.md +++ b/Source/Gapotchenko.FX.Text/README.md @@ -66,6 +66,8 @@ An immediate improvement in expressiveness without duplication. `StringBuilder.AppendJoin` is a method that appeared in later versions of .NET platform. Gapochenko.FX provides a corresponding polyfill that can be used in code targeting older .NET versions. +The benefit of this method is that it combines `string.Join` and `StringBuilder.Append` operations into one method using the underlying efficiency of `StringBuilder`. + ## Usage `Gapotchenko.FX.Text` module is available as a [NuGet package](https://nuget.org/packages/Gapotchenko.FX.Text): From ef7459f14676551d41d5542d16dadc54ee7b0431 Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 15:13:14 +0300 Subject: [PATCH 08/20] Update README.md --- Source/Gapotchenko.FX.Threading/README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Source/Gapotchenko.FX.Threading/README.md b/Source/Gapotchenko.FX.Threading/README.md index e0136e5c..15cc7c35 100644 --- a/Source/Gapotchenko.FX.Threading/README.md +++ b/Source/Gapotchenko.FX.Threading/README.md @@ -86,6 +86,19 @@ void SyncMethod() As you can see, `TaskBridge` has a lot of chances to become your tool #1, as it elegantly solves a world-class problem of bridging sync and async models together. +## Sequential, an Antogonist to Parallel + +.NET platform provides `System.Threading.Tasks.Parallel` class that contains a bunch of static methods allowing to execute the tasks in parallel. +But what if you want to temporarily switch them to a sequential execution mode? +For example, this can be useful when you to want to check a multithreading bug, and running tasks sequentially may give a good hint on where the bug resides. + +Of course, you can do that manually, for example, by changing `Parallel.ForEach` method to `foreach` C# language keyword. +But this is a lot of manual error-prone work! +That's why +`Gapotchenko.FX.Threading` module provides `Sequential` class, an anotogonist to `Parallel`. +It allows to make the switch by changing just the class name from `Parallel` to `Sequential` in a corresponding function call. +So `Parallel.ForEach` becomes `Sequential.ForEach`, and voila, the tasks are now executed sequentially allowing you to isolate that pesky multithreading bug. + ## Usage `Gapotchenko.FX.Threading` module is available as a [NuGet package](https://nuget.org/packages/Gapotchenko.FX.Threading): From 97657ab3dc3a176060d670da3c5e622dd324531f Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 15:14:26 +0300 Subject: [PATCH 09/20] Update README.md --- Source/Gapotchenko.FX.Threading/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Gapotchenko.FX.Threading/README.md b/Source/Gapotchenko.FX.Threading/README.md index 15cc7c35..658c854f 100644 --- a/Source/Gapotchenko.FX.Threading/README.md +++ b/Source/Gapotchenko.FX.Threading/README.md @@ -90,7 +90,6 @@ as it elegantly solves a world-class problem of bridging sync and async models t .NET platform provides `System.Threading.Tasks.Parallel` class that contains a bunch of static methods allowing to execute the tasks in parallel. But what if you want to temporarily switch them to a sequential execution mode? -For example, this can be useful when you to want to check a multithreading bug, and running tasks sequentially may give a good hint on where the bug resides. Of course, you can do that manually, for example, by changing `Parallel.ForEach` method to `foreach` C# language keyword. But this is a lot of manual error-prone work! From 89c5916c0bdd1878765ce97a375f79ad61698379 Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 15:14:41 +0300 Subject: [PATCH 10/20] Update README.md --- Source/Gapotchenko.FX.Threading/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.Threading/README.md b/Source/Gapotchenko.FX.Threading/README.md index 658c854f..6230a3c0 100644 --- a/Source/Gapotchenko.FX.Threading/README.md +++ b/Source/Gapotchenko.FX.Threading/README.md @@ -86,7 +86,7 @@ void SyncMethod() As you can see, `TaskBridge` has a lot of chances to become your tool #1, as it elegantly solves a world-class problem of bridging sync and async models together. -## Sequential, an Antogonist to Parallel +## `Sequential`, an Antogonist to `Parallel` .NET platform provides `System.Threading.Tasks.Parallel` class that contains a bunch of static methods allowing to execute the tasks in parallel. But what if you want to temporarily switch them to a sequential execution mode? From eccfe83698e92a204aa49a40a563f6be51c0b8ae Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 15:16:08 +0300 Subject: [PATCH 11/20] Update README.md --- Source/Gapotchenko.FX.Threading/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.Threading/README.md b/Source/Gapotchenko.FX.Threading/README.md index 6230a3c0..e5b39e45 100644 --- a/Source/Gapotchenko.FX.Threading/README.md +++ b/Source/Gapotchenko.FX.Threading/README.md @@ -92,7 +92,7 @@ as it elegantly solves a world-class problem of bridging sync and async models t But what if you want to temporarily switch them to a sequential execution mode? Of course, you can do that manually, for example, by changing `Parallel.ForEach` method to `foreach` C# language keyword. -But this is a lot of manual error-prone work! +But this is a lot of manual and error-prone work. That's why `Gapotchenko.FX.Threading` module provides `Sequential` class, an anotogonist to `Parallel`. It allows to make the switch by changing just the class name from `Parallel` to `Sequential` in a corresponding function call. From d69cbc9d58a5acd69fbf8605c3f782722a5189a3 Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 15:16:47 +0300 Subject: [PATCH 12/20] Update README.md --- Source/Gapotchenko.FX.Threading/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Source/Gapotchenko.FX.Threading/README.md b/Source/Gapotchenko.FX.Threading/README.md index e5b39e45..2a4da1bc 100644 --- a/Source/Gapotchenko.FX.Threading/README.md +++ b/Source/Gapotchenko.FX.Threading/README.md @@ -93,10 +93,9 @@ But what if you want to temporarily switch them to a sequential execution mode? Of course, you can do that manually, for example, by changing `Parallel.ForEach` method to `foreach` C# language keyword. But this is a lot of manual and error-prone work. -That's why -`Gapotchenko.FX.Threading` module provides `Sequential` class, an anotogonist to `Parallel`. +That's why `Gapotchenko.FX.Threading` module provides `Sequential` class, an anotogonist to `Parallel`. It allows to make the switch by changing just the class name from `Parallel` to `Sequential` in a corresponding function call. -So `Parallel.ForEach` becomes `Sequential.ForEach`, and voila, the tasks are now executed sequentially allowing you to isolate that pesky multithreading bug. +So `Parallel.ForEach` becomes `Sequential.ForEach`, and voila, the tasks are now executed sequentially allowing, you to isolate that pesky multithreading bug. ## Usage From 56dc190a8be91b203c48473b5e01477c320c94a7 Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 15:17:42 +0300 Subject: [PATCH 13/20] Update README.md --- Source/Gapotchenko.FX.Threading/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.Threading/README.md b/Source/Gapotchenko.FX.Threading/README.md index 2a4da1bc..d1d41f72 100644 --- a/Source/Gapotchenko.FX.Threading/README.md +++ b/Source/Gapotchenko.FX.Threading/README.md @@ -95,7 +95,7 @@ Of course, you can do that manually, for example, by changing `Parallel.ForEach` But this is a lot of manual and error-prone work. That's why `Gapotchenko.FX.Threading` module provides `Sequential` class, an anotogonist to `Parallel`. It allows to make the switch by changing just the class name from `Parallel` to `Sequential` in a corresponding function call. -So `Parallel.ForEach` becomes `Sequential.ForEach`, and voila, the tasks are now executed sequentially allowing, you to isolate that pesky multithreading bug. +So `Parallel.ForEach` becomes `Sequential.ForEach`, and voila, the tasks are now executed sequentially, allowing you to isolate that pesky multithreading bug. ## Usage From 2dddba798f363e5390ebd6c1322645c8f1c9c95d Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 15:17:58 +0300 Subject: [PATCH 14/20] Update README.md --- Source/Gapotchenko.FX.Threading/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.Threading/README.md b/Source/Gapotchenko.FX.Threading/README.md index d1d41f72..5c350fa8 100644 --- a/Source/Gapotchenko.FX.Threading/README.md +++ b/Source/Gapotchenko.FX.Threading/README.md @@ -95,7 +95,7 @@ Of course, you can do that manually, for example, by changing `Parallel.ForEach` But this is a lot of manual and error-prone work. That's why `Gapotchenko.FX.Threading` module provides `Sequential` class, an anotogonist to `Parallel`. It allows to make the switch by changing just the class name from `Parallel` to `Sequential` in a corresponding function call. -So `Parallel.ForEach` becomes `Sequential.ForEach`, and voila, the tasks are now executed sequentially, allowing you to isolate that pesky multithreading bug. +So `Parallel.ForEach` becomes `Sequential.ForEach`, and voila, the tasks are now executed sequentially allowing you to isolate that pesky multithreading bug. ## Usage From c4ae0be5e9273ff6a8e5a92527ce64b27b1ad2ab Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 15:20:13 +0300 Subject: [PATCH 15/20] Update README.md --- Source/Gapotchenko.FX.Threading/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.Threading/README.md b/Source/Gapotchenko.FX.Threading/README.md index 5c350fa8..4c42f2c5 100644 --- a/Source/Gapotchenko.FX.Threading/README.md +++ b/Source/Gapotchenko.FX.Threading/README.md @@ -95,7 +95,7 @@ Of course, you can do that manually, for example, by changing `Parallel.ForEach` But this is a lot of manual and error-prone work. That's why `Gapotchenko.FX.Threading` module provides `Sequential` class, an anotogonist to `Parallel`. It allows to make the switch by changing just the class name from `Parallel` to `Sequential` in a corresponding function call. -So `Parallel.ForEach` becomes `Sequential.ForEach`, and voila, the tasks are now executed sequentially allowing you to isolate that pesky multithreading bug. +So `Parallel.ForEach` becomes `Sequential.ForEach`, and voila, the tasks are now executed sequentially allowing you to isolate that pesky multithreading bug you were hunting for. ## Usage From 085b35b20a0f8247fb9e88bd77c74966acd31696 Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 15:29:34 +0300 Subject: [PATCH 16/20] Update README.md --- Source/Gapotchenko.FX.IO/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.IO/README.md b/Source/Gapotchenko.FX.IO/README.md index a17ddbfd..2c2cafc7 100644 --- a/Source/Gapotchenko.FX.IO/README.md +++ b/Source/Gapotchenko.FX.IO/README.md @@ -106,7 +106,7 @@ bool IsContosoReportsFolder(string path) => path.StartsWith(@"Contoso\Reports"); ``` It kind of works, until we try to pass something like `Contoso\ReportsBackup`. -The problem is `ReportsBackup` is a very different folder than `Reports`, but the provided function returns `true`. +The problem is that `ReportsBackup` is a very different folder than `Reports`, but the provided function returns `true` nevertheless. We can cheat here, and try to use an updated function that adds a trailing slash: From cb93e9107c1a55025a532bd31604fdf29f15f436 Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 15:30:53 +0300 Subject: [PATCH 17/20] Update README.md --- Source/Gapotchenko.FX.IO/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.IO/README.md b/Source/Gapotchenko.FX.IO/README.md index 2c2cafc7..a54cee0d 100644 --- a/Source/Gapotchenko.FX.IO/README.md +++ b/Source/Gapotchenko.FX.IO/README.md @@ -116,7 +116,7 @@ bool IsContosoReportsFolder(string path) => path.StartsWith(@"Contoso\Reports\") The problem is gone. Until we ask for `IsContosoReportsFolder("Contoso\Reports")` value. -It is `false` now despite the fact that `Contoso\Reports` is literally a Contoso reports folder we are so eagerly looking for. +It is `false` now despite the fact that `Contoso\Reports` is literally the folder we are so eagerly looking for. The correct solution is to use `FileSystem.PathStartsWith` method provided by `Gapotchenko.FX.IO` module: From ef6cefa43ecd0f36947a889950b531a6a1932706 Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 15:35:18 +0300 Subject: [PATCH 18/20] Update FragmentedMemoryStream.cs --- Source/Gapotchenko.FX.IO/FragmentedMemoryStream.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.IO/FragmentedMemoryStream.cs b/Source/Gapotchenko.FX.IO/FragmentedMemoryStream.cs index 0255923e..9ede06c3 100644 --- a/Source/Gapotchenko.FX.IO/FragmentedMemoryStream.cs +++ b/Source/Gapotchenko.FX.IO/FragmentedMemoryStream.cs @@ -13,7 +13,7 @@ namespace Gapotchenko.FX.IO /// /// /// is similar to but uses a dynamic list of byte arrays as a backing store. - /// This allows to use the memory address space more efficiently, as there is no need to allocate a contiguous memory block for the whole stream. + /// This allows it to use the memory address space more efficiently, as there is no need to allocate a contiguous memory block for the whole stream. /// public class FragmentedMemoryStream : Stream { From ad19e8a482081b9ee529e7961778fa44c1f40e93 Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 15:36:55 +0300 Subject: [PATCH 19/20] Update README.md --- Source/Gapotchenko.FX.Diagnostics.Process/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.Diagnostics.Process/README.md b/Source/Gapotchenko.FX.Diagnostics.Process/README.md index 76e79c69..dab68c45 100644 --- a/Source/Gapotchenko.FX.Diagnostics.Process/README.md +++ b/Source/Gapotchenko.FX.Diagnostics.Process/README.md @@ -160,7 +160,7 @@ As you can see, despite a simple-looking signature, the End(…) method gives en ### EndAsync() The method is similar to `End()` but has an async implementation. -If was created in order to efficiently handle a lot of processes in bulk. +It can be used to efficiently handle a lot of processes in bulk. ## Usage From 66f90ca67e9c3dcadd37987f290db72877599beb Mon Sep 17 00:00:00 2001 From: Oleksiy Gapotchenko Date: Sun, 24 Oct 2021 15:37:55 +0300 Subject: [PATCH 20/20] Update README.md --- Source/Gapotchenko.FX.Diagnostics.Process/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Gapotchenko.FX.Diagnostics.Process/README.md b/Source/Gapotchenko.FX.Diagnostics.Process/README.md index dab68c45..17d4cb0f 100644 --- a/Source/Gapotchenko.FX.Diagnostics.Process/README.md +++ b/Source/Gapotchenko.FX.Diagnostics.Process/README.md @@ -71,7 +71,7 @@ It allows to end a process according to a specified mode of operation. The default mode of operation is `ProcessEndMode.Complete` that follows a sequence presented below: 1. Graceful techniques are tried first: - 1.1. `End()` method tries to close a main window of a process + 1.1. `End()` method tries to close a main window of the process 1.2. If that fails, it tries to send Ctrl+C (SIGTERM) signal 2. Forceful techniques: 2.1. If graceful techniques fail, `End()` method tries to exit the process (suitable for the current process only)