web-dev-qa-db-ja.com

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

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

92
Rasmus Søborg

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

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

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

37
Reed Copsey

使用する必要があるのは、foreachループではなくAnyです。

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

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

11
Servy

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.
});
8
MBentley

提供できるloopStateを使用してください。

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

これを見てください MSDN記事 例については。

5
Mike Perrenoud