122

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;ステートメントは、次の構文エラーをスローします。

中断または継続する囲みループはありません

4

5 に答える 5

201

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();
        }
    }));
于 2012-09-24T18:56:38.770 に答える
51

これを行うには、ループ状態で渡されるParallel.Fororのオーバーロードを使用して呼び出し、次にorを呼び出します。主な違いは、物事が壊れる速さです。 を使用すると、ループは現在よりも前の「インデックス」を持つすべてのアイテムを処理します。を使用すると、できるだけ早く終了します。Parallel.ForEachParallelLoopState.BreakParallelLoopState.StopBreak()Stop()

詳細については、「方法: Parallel.For ループを停止または中断する」を参照してください。

于 2012-09-24T18:56:24.927 に答える
12

Anyforeach ループではなく、を使用する必要があります。

bool Found = ColorIndex.AsEnumerable().AsParallel()
    .Any(Element => Element.StartIndex <= I 
      && Element.StartIndex + Element.Length >= I);

Any結果が真でなければならないことがわかるとすぐに停止するほどスマートです。

于 2012-09-24T18:58:04.277 に答える
5

loopState提供できるものを使用するだけです。

Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),  
    new Action<ColorIndexHolder>((Element, loopState) => { 
        if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I) { 
            loopState.Stop();
        }     
})); 

例については、このMSDN の記事を参照してください。

于 2012-09-24T18:57:49.633 に答える