我正在尝试使用新的C#4.0 Parallel.ForEach函数在对象列表上执行并行函数。这是一个非常长的维护过程。我想让它按列表的顺序执行,以便我可以在上一点停止并继续执行。我该怎么做呢?

这是一个例子。我有一个对象列表:a1 to a100。这是当前订单:

a1, a51, a2, a52, a3, a53...


我要这个命令:

a1, a2, a3, a4...


我可以使某些对象乱序运行,但只要可以在列表中找到一个点,就可以说该点之前的所有对象都已运行。我阅读了并行编程的csharp白皮书,对此一无所获。 ParallelOptions类中没有为此设置。

最佳答案

如果使用Parallel.Break终止循环,则将确保已执行所有低于返回值的索引。这大约是您所能达到的。此处的示例使用For,但是ForEach具有类似的重载。

int n = ...
var result = new double[n];

var loopResult = Parallel.For(0, n, (i, loopState) =>
{
   if (/* break condition is true */)
   {
      loopState.Break();
      return;
   }
   result[i] = DoWork(i);
});

if (!loopResult.IsCompleted &&
        loopResult.LowestBreakIteration.HasValue)
{
   Console.WriteLine("Loop encountered a break at {0}",
                      loopResult.LowestBreakIteration.Value);
}


在ForEach循环中,将为每个分区中的每个元素在内部生成一个迭代索引。执行是不按顺序进行的,但是在中断之后,您知道所有低于LowestBreakIteration的迭代都将完成。

取自“使用Microsoft .NET进行并行编程” http://parallelpatterns.codeplex.com/

在MSDN上可用。请参见http://msdn.microsoft.com/en-us/library/ff963552.aspx。 “尽早突破循环”一节介绍了这种情况。

另请参阅:http://msdn.microsoft.com/en-us/library/dd460721.aspx

09-25 18:18
查看更多