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
のオーバーロードを使用して呼び出し、次に ParallelLoopState.Break
または ParallelLoopState.Stop
を呼び出します。主な違いは、物事がどれほど速く壊れるかです-Break()
を使用すると、ループは現在よりも早い「インデックス」を持つすべてのアイテムを処理します。 Stop()
を使用すると、できるだけ早く終了します。
詳細については、「 方法:Parallel.Forループを停止または中断する 」を参照してください。
使用する必要があるのは、foreachループではなくAny
です。
bool Found = ColorIndex.AsEnumerable().AsParallel()
.Any(Element => Element.StartIndex <= I
&& Element.StartIndex + Element.Length >= I);
Any
は、結果がtrueでなければならないことがわかるとすぐに停止するほどスマートです。
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.
});
提供できるloopState
を使用してください。
Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
new Action<ColorIndexHolder>((Element, loopState) => {
if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I) {
loopState.Stop();
}
}));
これを見てください MSDN記事 例については。