24

Suppose, I don't set any values explicitly by calling the function:

System.Threading.ThreadPool.SetMaxThreads

What are the default values?

4

3 に答える 3

25

2.0、3.0、4.0 で変更された .NET フレームワークのバージョンによって異なります。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 スレッドが完了しない理由について非常に良いヒントが得られます。コール スタックを確認できます。

于 2012-06-08T11:43:58.317 に答える
5

プロセスごとに 1 つのスレッド プールがあります。.NET Framework バージョン 4 以降、プロセスのスレッド プールの既定のサイズは、仮想アドレス空間のサイズなど、いくつかの要因によって異なります。プロセスは、GetMaxThreads メソッドを呼び出して、スレッドの数を決定できます。スレッド プール内のスレッドの数は、SetMaxThreads メソッドを使用して変更できます。各スレッドはデフォルトのスタック サイズを使用し、デフォルトの優先度で実行されます。引用符

.NET Framework をホストするアンマネージ コードは、mscoree.h ファイルで定義されている CorSetMaxThreads 関数を使用して、スレッド プールのサイズを変更できます。

于 2012-06-08T11:14:41.233 に答える
2

これは固定数ではなく、利用可能なメモリやその他の要因に依存します。GetMaxThreads()

于 2012-06-08T11:12:13.013 に答える