Parallel.For 方法在多个线程之间进行内部分叉迭代,但随后它会阻塞直到它们全部完成。因此,从主要功能的角度来看,您的代码是一个序列代码:
我们分叉循环迭代的处理,并且我们加入使得并行循环调用仅在所有并发处理完成时完成。
如果您需要通过循环共享一些本地状态,请使用函数的Parallel.For Method (Int32, Int32, Func, Func, Action)版本:
public static ParallelLoopResult For<TLocal>(
int fromInclusive,
int toExclusive,
Func<TLocal> localInit,
Func<int, ParallelLoopState, TLocal, TLocal> body,
Action<TLocal> localFinally
)
下图描述了它的工作原理:
以下是计算并行 PI 的示例实现:
static double ParallelPi()
{
double sum = 0.0;
double step = 1.0 / (double)NUM_STEPS;
object obj = new object();
Parallel.For(0, NUM_STEPS,
() => 0.0,
(i, state, partial) =>
{
double x = (i + 0.5) * step;
return partial + 4.0 / (1.0 + x * x);
},
partial => { lock (obj) sum += partial; });
return step * sum;
}
有关 Parallel 类如何与示例一起工作的深入信息,请阅读Patterns for Parallel Programming:Understanding and Applying Parallel Patterns with the .NET Framework 4(Blackquote、图像和示例取自那里)