ジョブ キュー内のアイテムの for ループから ThreadPool.QueueUserWorkItem() API を使用してファイル コピー操作を実行するために複数のスレッドを生成する状況があります。ジョブ キューには約 50 個のアイテムが含まれています (テスト目的で使用)。
私たちは最大数を期待していました。処理のために 50 のスレッドが生成されるか、システムが (より高い作業負荷を使用して) 多くのスレッドを確保できない場合はさらに少なくなります。しかし、私たちがノーを印刷したとき。ThreadPool.GetAvailableThreads(out _iWorkerThreads, out _ioThreads) を使用してプール内の使用可能なスレッドを取得すると、定数 1023 (ワーカー スレッドのジョブ サイズ 50 の場合) が取得され、I/O スレッドのデータは取得されません。
非常に多くのスレッドが生成される理由がわかりません。ThreadPool.GetAvailableThreads からの出力は信頼できますか? スレッド プールの最大スレッド数を設定すると役に立ちますか? 平均数を評価する信頼できる方法は何ですか。プールからのプロセスによって使用されているマネージド スレッドの数は?
アプリの実行中に CPU 使用率がほぼ 100% に急上昇する理由を教えてください。このコードは、ジョブの完了をメイン スレッドに通知するために、各ジョブに添付された WaitHandles (通常は ManualResetEvent) を使用します。