如何摆脱parallel.for循环?
我有一个非常复杂的陈述,如下所示:
Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
new Action<ColorIndexHolder>((ColorIndexHolder Element) =>
{
if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I)
{
Found = true;
break;
}
}));
使用并行类,我可以优化此过程。然而;我无法弄清楚如何打破并行循环? break;
语句抛出以下语法错误:
没有封闭的圈子可以打破或继续
答案 0 :(得分:158)
Parallel.ForEach(list,
(i, state) =>
{
state.Break();
});
或者在你的情况下:
Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
new Action<ColorIndexHolder, ParallelLoopState>((ColorIndexHolder Element, ParallelLoopState state) =>
{
if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I)
{
Found = true;
state.Break();
}
}));
答案 1 :(得分:34)
您可以通过使用传递循环状态的Parallel.For
或Parallel.ForEach
的重载调用,然后调用ParallelLoopState.Break
或ParallelLoopState.Stop
来执行此操作。事情的主要区别在于事情的破坏速度 - 使用Break()
,循环将使用比当前更早的“索引”处理所有项目。使用Stop()
,它会尽快退出。
答案 2 :(得分:11)
你应该使用的是Any
,而不是foreach循环:
bool Found = ColorIndex.AsEnumerable().AsParallel()
.Any(Element => Element.StartIndex <= I
&& Element.StartIndex + Element.Length >= I);
Any
足够聪明,一旦知道结果必须为真,就立即停止。
答案 3 :(得分:8)
LoopState肯定是一个很好的答案。我发现以前的答案有很多其他的东西,很难看到答案,所以这是一个简单的案例:
using System.Threading.Tasks;
Parallel.ForEach(SomeTable.Rows(), (row, loopState) =>
{
if (row.Value == testValue)
{
loopState.Stop(); // Stop the ForEach!
}
// else do some other stuff here.
});
答案 4 :(得分:5)
只需使用可提供的loopState
。
Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
new Action<ColorIndexHolder>((Element, loopState) => {
if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I) {
loopState.Stop();
}
}));
请查看此MSDN article以获取示例。