打破parallel.foreach?
我如何摆脱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;
语句抛出以下语法错误:
没有封闭的环路可以打破或继续
使用ParallelLoopState.Break
方法:
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(); } }));
你可以通过调用Parallel.For
或者Parallel.ForEach
的重载Parallel.For
来调用,这个函数会在循环状态下传递,然后调用ParallelLoopState.Break
或者ParallelLoopState.Stop
。 主要的区别在于事情的速度有多快 – 使用Break()
,循环将处理比当前更早的“索引”的所有项目。 Stop()
,它将尽快退出。
有关详细信息,请参阅如何:停止或从Parallel.For循环中断 。
你应该使用什么,而不是一个foreach循环:
bool Found = ColorIndex.AsEnumerable().AsParallel() .Any(Element => Element.StartIndex <= I && Element.StartIndex + Element.Length >= I);
Any
知道结果必须是真的, Any
都足够聪明就能够停下来。
只需使用可以提供的loopState
。
Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(), new Action<ColorIndexHolder>((Element, loopState) => { if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I) { loopState.Stop(); } }));
看这个MSDN文章的例子。
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. });