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