假设,我没有通过调用函数显式设置任何值:
System.Threading.ThreadPool.SetMaxThreads
默认值是多少?
它取决于 .NET 框架版本,在 2.0、3.0 和 4.0 中进行了更改。在 2.0 中,它是内核数量的 50 倍。在 3.0(又名 2.0 SP1)中,它是内核数量的 250 倍,而 4.0 使其动态取决于位数和操作系统资源。如果我没记错的话,最大 I/O 完成线程总是 1000。
一般来说,它非常高,程序永远不应该接近。在 32 位机器上,当所有这些线程使用它们的 1 兆字节堆栈消耗可用的虚拟内存时,该程序很可能首先使用 OOM 进行轰炸。一般来说,只有当 TP 线程请求很多并且运行的线程数分钟都没有完成时,它才会失控。TP 线程的理想状态是不超过半秒。
Debug > Windows > Threads 调试器窗口说出了令人不快的事实。并且很好地提示了为什么这些 TP 线程没有完成,你可以看到它们的调用堆栈。
每个进程有一个线程池。从 .NET Framework 版本 4 开始,进程的线程池的默认大小取决于几个因素,例如虚拟地址空间的大小。进程可以调用 GetMaxThreads 方法来确定线程数。可以使用 SetMaxThreads 方法更改线程池中的线程数。每个线程使用默认堆栈大小并以默认优先级运行。块引用
托管 .NET Framework 的非托管代码可以使用在 mscoree.h 文件中定义的 CorSetMaxThreads 函数来更改线程池的大小。
它不是一个固定数字,它取决于可用内存和其他因素 - 您可以在运行时使用GetMaxThreads()