假设我没有通过调用函数显式设置任何值:
System.Threading.ThreadPool.SetMaxThreads
默认值是什么?
答案 0 :(得分: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线程的理想选择是不要超过半秒。
调试> Windows>线程调试器窗口告诉不愉快的事实。并给出了一个非常好的提示,为什么这些TP线程没有完成,你可以看到他们的调用栈。
答案 1 :(得分:3)
每个进程有一个线程池。从.NET开始 框架版本4,进程的线程池的默认大小 取决于几个因素,例如虚拟地址的大小 空间。进程可以调用GetMaxThreads方法来确定 线程数。线程池中的线程数可以是 通过使用SetMaxThreads方法更改。每个线程使用 默认堆栈大小并以默认优先级运行。 块引用
承载.NET Framework的非托管代码可以更改其大小 线程池使用CorSetMaxThreads函数,在。中定义 mscoree.h文件。
答案 2 :(得分:1)
它不是固定数字,它取决于可用内存和其他因素 - 您可以在运行时使用GetMaxThreads()