Raw performance, or the number of calculations per second that our program is able to perform, is not always a most important goal to achieve. Sometimes it is even more important to stay responsive and interact with the user as fast as possible. Unfortunately, it is not easy to achieve both these advantages at the same time; there are situations when we need to choose our primary goal.
To simulate such a situation, let's create a combination of coarse-grained computational tasks that takes a long time to complete and runs in the background, and a number of short-lived tasks representing user interaction. We would like these short tasks to run as fast as possible with low latency. Now we write a code to test how these long-running tasks can affect latency:
for (var longThreadCount = 0; longThreadCount < 24; longThreadCount++) { // Create coarse grained tasks var longThreads = new List<Task>(); for (var i = 0; i < longThreadCount...