打破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. });