System.Threading.ThreadPool.SetMaxThreads的默认值

Sha*_*fiz 18 .net c# default threadpool

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

System.Threading.ThreadPool.SetMaxThreads
Run Code Online (Sandbox Code Playgroud)

什么是默认值?

Han*_*ant 18

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

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

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


Die*_*ego 5

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

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