我正在尝试使用新的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