.Netの並列拡張機能でParallel.For()を使用することに慣れました。これは、スレッドを手動で開始して維持する必要がなく、コードを並列化する簡単な方法であるためです(面倒な場合があります)。私は今、並列化したい無限ループ(停止するように信号を送るまで何かをする)を見ています、これを行うための引数のないParallel.For()オーバーロードはないので、ここでの最良のアプローチは何でしょうか?なれ。原則として、私は次のようなことを行うことができます。
Parallel.For(0, int.Max)
しかし、それは作業分割ロジックが処理するための期待される/効率的なパターンではないかもしれないと私は思っています(?)
別のオプションは次のようなものです。
for(;;)
{
Parallel.For(0, 128, delegate()
{
// Do stuff.
}
}
しかし、それはエレガントではないように思われ、非効率的な作業分割につながる可能性もあります。
今のところ、私の本能は、自分のスレッドを作成して維持することによってこれを手動で行うことですが、これに関するフィードバック/意見を得ることに興味があります。ありがとう。
===更新===
受け入れられた回答の記事のコードの簡略化されたバージョンを使用しています(ParallelOptionsパラメーターを削除しました)。これがコードです...
public class ParallelUtils
{
public static void While(Func<bool> condition, Action body)
{
Parallel.ForEach(IterateUntilFalse(condition), ignored => body());
}
private static IEnumerable<bool> IterateUntilFalse(Func<bool> condition)
{
while (condition()) yield return true;
}
}
使用例は次のとおりです。
Func<bool> whileCondFn = () => !_requestStopFlag;
ParallelUtils.While(whileCondFn, delegate()
{
// Do stuff.
});