Рассмотрим следующий код. Я начинаю с задачи, которая ничего не делает, а затем использую ContinueWith () для запуска 10 вызовов метода, увеличивающего счетчик.
Когда я запускаю эту программу, она печатает «0», указывая на то, что метод increment () вообще не звонили. Я ожидал, что он будет вызываться 10 раз, поскольку именно столько раз я вызывал ContinueWith ().
Если я раскомментирую строку «Thread.Sleep (20)», то будет выведено «10», как и ожидалось.
Это происходит в режиме выпуска или отладки. Моя система представляет собой двухъядерный четырехъядерный процессор с гиперпоточностью (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;
}
}
Кто-нибудь может избавиться от чего-либо света, что здесь происходит?