個々のタスクごとに ThreadPool を使用することは、間違いなく悪い考えです。私の経験からすると、これはパフォーマンスを向上させるどころか、パフォーマンスを低下させる傾向があります。1 つ目の理由は、ThreadPool を実行するためのタスクを割り当てるためだけに、かなりの量のオーバーヘッドが必要になることです。デフォルトでは、各アプリケーションには、最大 100 スレッド容量で初期化された独自の ThreadPool が割り当てられます。400 の操作を並行して実行している場合、キューがリクエストで満たされるのにそれほど時間はかかりません。現在、最大 100 のスレッドがすべて CPU サイクルをめぐって競合しています。はい、.NET フレームワークは、キューのスロットリングと優先順位付けで素晴らしい仕事をしますが、ThreadPool は、おそらくあまり頻繁に発生しない長時間実行される操作 (構成ファイルの読み込み、またはランダムな Web 要求) のために残しておくのが最善であることがわかりました。 )。ThreadPool を使用してランダムにいくつかの操作を開始することは、数百の要求を一度に実行するために使用するよりもはるかに効率的です。現在の情報を考えると、最善の行動方針は次のようなものになります。
アプリケーションが要求を投稿できるキューを使用して、System.Threading.Thread を作成します (または SINGLE ThreadPool スレッドを使用します)。
FileStream の BeginRead メソッドと BeginWrite メソッドを使用して、IO 操作を実行します。これにより、.NET フレームワークはネイティブ API を使用して IO (IOCP) をスレッド化および実行します。
これにより、2 つのレバレッジが得られます。1 つは、オペレーティング システムがファイル システム アクセスとスレッドを管理できるようにしながら、リクエストが並行して処理されることです。2 つ目は、大多数のシステムのボトルネックが HDD になるため、カスタムの優先度の並べ替えとスロットリングをリクエスト スレッドに実装して、リソースの使用をより細かく制御できることです。
現在、私は同様のアプリケーションを作成しており、この方法を使用すると効率的で高速です...スレッド化やスロットリングがなければ、アプリケーションは 10 ~ 15% の CPU しか使用していませんでしたが、関連する処理によっては一部の操作で許容できる場合があります。 、アプリケーションが CPU の 80% 以上を使用しているかのように PC が遅くなりました。これはファイル システム アクセスでした。ThreadPool および IOCP 関数は、PC の動作が遅くなっても気にしないので、混乱しないでください。たとえそのパフォーマンスが HDD の豚のようにきしむことを意味するとしても、これらはパフォーマンスのために最適化されています。
私が経験した唯一の問題は、一度に約 35 のストリームを開いているテスト段階で、メモリ使用量が少し高くなった (50 MB 以上) ことです。私は現在、SocketAsyncEventArgsに対する MSDN の推奨事項と同様のソリューションに取り組んでおり、プールを使用して x 数のリクエストを同時に処理できるようにしているため、最終的にこのフォーラムの投稿にたどり着きました。
これが将来の意思決定に役立つことを願っています:)