下面的c#5.0中的Parallel.For<string>的结果是错误的吗?
Is the result wrong about the Parallel.For<string> in c# 5.0 below?
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 and .NET 4.5.1》这本书上得到了这些代码,书中第560页显示了结果:
我觉得我用红色缠绕的结果可能是错误的,应该是"body i 1 str1 t1 thread 1 task 1",我理解的对吗?或者我错了。有没有人可以向我解释这些?谢谢
我认为你是对的。分解代码:
第一个匿名函数每个线程调用一次,returns这一行的初始状态:
return String.Format("t{0}", Thread.CurrentThread.ManagedThreadId);
因此对于每个线程,初始状态的格式为 t#
。然后将该状态作为参数 str1
传递给第二个匿名函数。第二个匿名函数打印出一些信息(包括str1
的值)然后returns一个新的状态值:
return String.Format("i {0}", i);
这将传递到由同一线程执行的下一次迭代。
由于每个线程的状态都被初始化为 t#
格式,因此每个线程打印的第一个 body
语句应该具有该格式的 str1
值。只有来自该线程的后续 body
语句才应具有格式为 i #
.
的值 str1
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 and .NET 4.5.1》这本书上得到了这些代码,书中第560页显示了结果:
我觉得我用红色缠绕的结果可能是错误的,应该是"body i 1 str1 t1 thread 1 task 1",我理解的对吗?或者我错了。有没有人可以向我解释这些?谢谢
我认为你是对的。分解代码:
第一个匿名函数每个线程调用一次,returns这一行的初始状态:
return String.Format("t{0}", Thread.CurrentThread.ManagedThreadId);
因此对于每个线程,初始状态的格式为 t#
。然后将该状态作为参数 str1
传递给第二个匿名函数。第二个匿名函数打印出一些信息(包括str1
的值)然后returns一个新的状态值:
return String.Format("i {0}", i);
这将传递到由同一线程执行的下一次迭代。
由于每个线程的状态都被初始化为 t#
格式,因此每个线程打印的第一个 body
语句应该具有该格式的 str1
值。只有来自该线程的后续 body
语句才应具有格式为 i #
.
str1