下面的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