打破parallel.foreach?

时间:2012-09-24 18:51:40

标签: c# multithreading parallel-processing 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;语句抛出以下语法错误:

  

没有封闭的圈子可以打破或继续

5 个答案:

答案 0 :(得分:158)

使用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();
        }
    }));

答案 1 :(得分:34)

您可以通过使用传递循环状态的Parallel.ForParallel.ForEach的重载调用,然后调用ParallelLoopState.BreakParallelLoopState.Stop来执行此操作。事情的主要区别在于事情的破坏速度 - 使用Break(),循环将使用比当前更早的“索引”处理所有项目。使用Stop(),它会尽快退出。

有关详细信息,请参阅How to: Stop or Break from a Parallel.For Loop

答案 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以获取示例。