次のようなコードがあります。
Parallel.Foreach(ItemSource(),(item)=>DoSomething(item));
ItemSource()
アイテムの無限のストリームを生成します。
何らかの条件が満たされたときにループを終了させたいのですが、DoSomething で例外をスローせずに終了したいと考えています (このアプローチは悪いプログラミング スタイルだと思います)。
理想的には、cancelToken のようなものがあるでしょう。1 つ以上のスレッドで cancelToken.Activate() を呼び出します。その後、parallel.foreach は新しいスレッドの作成を停止し、最後のスレッドが終了した後、関数は戻ります。
Parallel.ForEach を使用して c# でこれを行うことは可能ですか、それともスレッド insteag を使用する必要がありますか?
更新マイクロソフトが私がそれを行うことを提案 する方法は次のとおりです。
try
{
Parallel.ForEach(nums, po, (num) =>
{
double d = Math.Sqrt(num);
Console.WriteLine("{0} on {1}", d, Thread.CurrentThread.ManagedThreadId);
po.CancellationToken.ThrowIfCancellationRequested();
});
}
catch (OperationCanceledException e)
{
Console.WriteLine(e.Message);
}
デリゲート内で例外をスローする必要があるため、このアプローチは好きではありません。