Task.ContinueWith не работает так, как я ожидал

Рассмотрим следующий код. Я начинаю с задачи, которая ничего не делает, а затем использую 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;
    }
}

Кто-нибудь может избавиться от чего-либо света, что здесь происходит?

5
задан Matthew Watson 9 August 2011 в 14:08
поделиться