1

これは以前に尋ねられ、議論されたことは知っていますが、それでもこのシナリオで何を使用するかは明確ではないと思います.

一度に 16 の要求を処理できることがわかっている Web サービスに対して 100 回の呼び出しを行う必要があります (それ以上の要求を受け取っても失敗するわけではありません)。

Parallel.ForEach は、より低レベルの CPU を集中的に使用する呼び出し用であると思います。最適なスレッド数を決定します。Task.Factory はスレッド プールを使用するため、16 未満のスレッド (およびそれ以上) が存在する可能性があります。

もちろん、独自のスレッド プールを作成することもできますが、このシナリオではもっと明白な選択肢はないのでしょうか?

4

1 に答える 1

1

私は使用しますが、 with set を 16 にParallel.ForEach指定します。そうすることで、必要な並列度を非常に明確に示すことができます。ParallelOptionsMaxDegreeOfParallelism

を使用する場合、16 を超える同時タスクTask.Factory取得すると仮定するのが妥当だと思いますが、非同期 IO を使用する場合は、とにかく 16 の同時スレッドを持つ必要はありません。

TPL Dataflowをご覧になることをお勧めします。コンシューマーを簡単に分割できることについては特に調べていませんが、プロデューサー/コンシューマーのシナリオを真っ向から狙っているため、16 個のコンシューマーを作成できなかったとしたら驚きです。100回の呼び出しを生成するだけです。

BlockingCollectionまたはもちろん、100 回の呼び出しで同じデータを消費する 16 のスレッドを作成することもできます。それは並列処理のレベルを保証します...

実際に同じ HTTP ホストに対して同時に 16 の呼び出しを行うには、app.config の<connectionManagement>一部を微調整する必要がある場合があることに注意してください。

于 2013-03-11T09:36:59.073 に答える