IEnumerator
スレッドセーフな実装を返す Execute に対する答えはほとんどありません。そうは言っても、これは生産者と消費者のパターンのもう 1 つのケースのように思えます。
あなたの特定のシナリオでは、 Execute を呼び出した元のスレッドに結果を順番に読み取らせ、BlockingCollection<T>
. Task
ただし、それを開始する前に、を使用してこれらのアイテムの消費を制御するセパレートを開始する必要がありますParallel::ForEach
。GetConsumingPartitioner
この場合、デフォルトのパーティショナーは必要以上のオーバーヘッドを作成するため、最も効率的にするために、おそらく ParallelExtensions ライブラリのメソッドの使用も検討する必要があります。詳細については、このブログ投稿を参照してください。
BlockingCollection<T>
rawを使用することの追加のボーナスは、コンシューマーが追いつくことができないほど多くのアイテムをプロデューサーがコレクションに追加するのをブロックするのに役立つ境界ConcurrentQueueu<T>
を設定する機能を提供することです。もちろん、アプリケーションのスイート スポットを見つけるために、いくつかのパフォーマンス テストを行う必要があります。