スレッドが機能する方法は、OS によってプロセッサ時間が与えられることです。これが起こるとき、これはコンテキストスイッチと呼ばれます。コンテキストの切り替えには、約 2000 ~ 8000 サイクルかかります (つまり、プロセッサの 2000 ~ 8000 命令によって異なります)。OS に多数の CPU またはコアがある場合、CPU を 1 つのスレッドから切り離して別のスレッドに渡す必要がない場合があります。これにより、コンテキストの切り替えが回避されます。一度に実行できる CPU ごとのスレッドは 1 つだけです。CPU よりも CPU を必要とするスレッドが多い場合は、コンテキスト スイッチを強制します。コンテキストの切り替えは、システム クォンタムより速く実行されません (クライアントの場合は 20 ミリ秒ごと、サーバーの場合は 120 ミリ秒ごと)。
5000 のバックグラウンド ワーカーがある場合、事実上 5000 のスレッドがあります。これらの各スレッドは、潜在的に CPU 時間を争っています。Windows のクライアント バージョンでは、1 秒あたり 250,000 回のコンテキスト スイッチを意味します。つまり、1 秒あたり 500,000,000 から 2,000,000,000 サイクルが、単にスレッド間の切り替えに費やされます。(つまり、スレッドが実行している作業に加えて) 1 秒あたりにその数のコンテキスト スイッチを処理できる場合。
推奨される方法は、プロセッサごとに 1 つの CPU バウンド スレッドのみを持つことです。CPU バウンド スレッドは、「待機」にほとんど時間を費やさないスレッドです。UI スレッドは、CPU バウンド スレッドではありません。バックグラウンド ワーカーがロックの待機に多くの時間を費やしている場合、それらも CPU バウンドではない可能性がありますが、一般に、バックグラウンド ワーカー スレッドは CPU バウンドです。(そうでなければ、バックグラウンド ワーカーを使用する意味は何でしょう?)。
また、OS は、次に CPU を取得するためにどのスレッドが必要かを判断するのに多くの時間を費やします。スレッドの優先度を変更し始めると、それが妨げられ、ほとんどの場合、システム全体 (アプリケーションだけでなく) が速くなるどころか遅くなります。
アップデート:
関連する問題では、新しいスレッドを作成するのに約 200,000 サイクル、スレッドを破棄するのに約 100,000 サイクルかかります。
更新 2:
質問の原動力が単に「できるかどうか」ではなく、ワークロードをスケーリングできるようにすることである場合、@ JoshW / @Servyが言及しているように、プロデューサー/コンシューマーパターンのようなものを使用すると、水平方向を促進できるスケーラビリティが可能になりますキューまたはサービス バスを介して複数のコンピューター/ノードにスケーリングします。適切な量のスレッドを単純に起動しても、CPU の数を超えて拡張することはできません。「利用可能なリソース...マシンがどれだけ過負荷になっているか」という理由でスケールアウトできるアーキテクチャが本当に必要な場合は、単に不可能です。