関数を呼び出して値を明示的に設定しないとします。
System.Threading.ThreadPool.SetMaxThreads
デフォルト値は何ですか?
これは、2.0、3.0、および4.0で変更された.NETFrameworkのバージョンによって異なります。 2.0では、コアの数は50倍でした。 3.0(別名2.0 SP1)では、コア数は250倍でしたが、4.0ではビット数とOSリソースに応じて動的になりました。正しく覚えていれば、最大I/O完了スレッドは常に1000でした。
一般的に、それはめちゃくちゃ高く、プログラムは決して近づくべきではありません。 32ビットマシンでは、これらのスレッドすべてが1メガバイトのスタックで使用可能な仮想メモリを消費すると、プログラムは最初にOOMで爆撃する可能性が非常に高くなります。一般に、TPスレッド要求が多く、実行中の要求が分の間完了していない場合にのみ、手に負えなくなります。 TPスレッドの理想は、0.5秒を超えないことです。
Debug> Windows> Threadsデバッガウィンドウは、不快な真実を伝えます。そして、これらのTPスレッドが完了していない理由を非常によく示しています。コールスタックを確認できます。
プロセスごとに1つのスレッドプールがあります。 .NET Frameworkバージョン4以降、プロセスのスレッドプールのデフォルトのサイズは、仮想アドレス空間のサイズなどのいくつかの要因によって異なります。プロセスは、GetMaxThreadsメソッドを呼び出して、スレッドの数を判別できます。スレッドプール内のスレッド数は、SetMaxThreadsメソッドを使用して変更できます。各スレッドはデフォルトのスタックサイズを使用し、デフォルトの優先度で実行されます。ブロッククォート
.NET Frameworkをホストするアンマネージコードは、mscoree.hファイルで定義されているCorSetMaxThreads関数を使用して、スレッドプールのサイズを変更できます。
これは固定数ではなく、使用可能なメモリやその他の要因によって異なります。実行時にGetMaxThreads()
を使用して見つけることができます。