System.Threading.ThreadPool.SetMaxThreads的默认值

假设,我没有通过调用函数显式设置任何值:

System.Threading.ThreadPool.SetMaxThreads 

什么是默认值?

它取决于.NET框架版本,在2.0,3.0和4.0中进行了更改。 在2.0中它是核心数量的50倍。 在3.0(又名2.0 SP1)中,它是内核数量的250倍,4.0根据位数和操作系统资源使其动态化。 如果我没记错的话,Max I / O完成线程总是1000。

一般来说,它是疯狂的高,一个程序永远不会接近。 在一台32位计算机上,当所有这些线程消耗了具有1兆字节堆栈的可用虚拟内存时,该程序很可能首先使用OOM进行轰炸。 一般情况下,只有当有很多TP线程请求并且正在运行的请求没有完成几分钟时,它才会失控。 TP线程的理想选择是不要超过半秒。

Debug> Windows> Threads调试器窗口告诉了令人不快的事实。 并给出了一个非常好的提示,为什么这些TP线程没有完成,你可以看到他们的调用栈。

每个进程有一个线程池。 从.NET Framework版本4开始,进程的线程池的默认大小取决于多个因素,例如虚拟地址空间的大小。 进程可以调用GetMaxThreads方法来确定线程数。 可以使用SetMaxThreads方法更改线程池中的线程数。 每个线程使用默认堆栈大小并以默认优先级运行。 大段引用

承载.NET Framework的非托管代码可以使用mscoree.h文件中定义的CorSetMaxThreads函数来更改线程池的大小。

它不是固定数字,它取决于可用内存和其他因素 – 您可以通过使用GetMaxThreads()在运行时找到它