Рассмотрим следующий код.Я начинаю с задачи, которая ничего не делает, а затем с помощью ContinueWith () запускаю 10 вызовов метода, увеличивающего счетчик.
Когда я запускаю эту программу, она печатает «0», указывая, что приращение() метод не был вызван вообще.Я ожидал, что он будет вызван 10 раз, поскольку именно столько раз я вызывал ContinueWith ().
Если я раскомментирую строку «Thread.Sleep (20)», то она печатает «10», как и ожидалось.
Это происходит в режиме выпуска или отладки.Моя система - это ядро 2 с четырьмя ядрами с гиперпоточностью (8 логических ядер) под управлением Windows 7 x64.
Я предполагаю, что у меня есть какое-то фундаментальное недоразумение о том, как работает Task.ContinueWith () ....
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
class Program
{
static void Main()
{
using (var task = Task.Factory.StartNew(()=>{}))
{
for (int i = 0; i < 10; ++i)
{
task.ContinueWith(_=> increment());
// Thread.Sleep(20); // Uncomment to print 10 instead of 0.
}
task.Wait();
}
// This prints 0 UNLESS you uncomment the sleep above.
Console.WriteLine(counter);
}
static void increment()
{
Interlocked.Increment(ref counter);
}
private static int counter;
}
}
Кто-нибудь может пролить свет на то, что здесь происходит?