2016-03-10 6 views
0
Parallel.For<string>(0, 20,() => 
    { 
     // invoked once for each thread 
     Console.WriteLine("init thread {0}, task {1}", Thread.CurrentThread.ManagedThreadId, Task.CurrentId); 
     return String.Format("t{0}", 
     Thread.CurrentThread.ManagedThreadId); 
    }, (i, pls, str1) => 
    { 
     // invoked for each member 
     Console.WriteLine("body i {0} str1 {1} thread {2} task {3}", i, str1, 
     Thread.CurrentThread.ManagedThreadId, Task.CurrentId); 
     Thread.Sleep(10); 
     return String.Format("i {0}", i); 
    }, (str1) => 
    { 
     // final action on each thread 
     Console.WriteLine("finally {0}", str1); 
    }); 

Я получил этот код из книги "Professional C# 5.0 и .NET 4.5.1", и книга показывает результат на странице 560:Является ли результат неправильным для Parallel.For <string> в C# 5.0 ниже?

enter image description here

Я думаю, что результат, когда я вокруг он с красным перетяжком может быть неправильным, он должен быть «body i 1 str1 t1 thread 1 task 1», я понимаю, что это правильно? или я был неправ. Кто-нибудь может объяснить это мне? спасибо

ответ

0

Я думаю, что вы правы. Ломая код:

Первая анонимная функция вызывается один раз для каждого потока, и возвращает исходное состояние в этой строке:

return String.Format("t{0}", Thread.CurrentThread.ManagedThreadId); 

Таким образом, для каждого потока, начальное состояние в формате t#. Это состояние затем передается во вторую анонимную функцию как параметр str1. Вторая анонимная функция выводит некоторую информацию (включая стоимость str1), а затем возвращает новое значение состояния:

return String.Format("i {0}", i); 

Это будет послан в следующую итерацию, выполняемой в том же потоке.

Поскольку состояние каждого потока инициализируется в формате t#, первый оператор body, напечатанный каждым потоком, должен иметь значение str1 в этом формате. Только последующие операторы body из этого потока должны иметь значение str1 в формате i #.