System.Threading.ThreadPool.SetMaxThreads的默认值是什么?

25

假设我没有通过调用函数明确设置任何值:

System.Threading.ThreadPool.SetMaxThreads

默认值是什么?

3个回答

28
这取决于.NET框架版本,2.0、3.0和4.0都有所改变。在2.0中,线程池最多是核心数的50倍。在3.0(又名2.0 SP1)中,它是核心数的250倍;4.0则根据位数和操作系统资源进行动态设置。如果我没记错,最大I/O完成线程始终为1000。
总的来说,这个值非常高,程序应该永远不会接近它。在32位机器上,当所有这些线程使用它们的一个兆字节堆栈消耗可用虚拟内存时,程序很可能首先崩溃。一般情况下,只有在有大量TP线程请求且运行中的线程未在几分钟内完成时,才会失控。TP线程的理想情况是不要超过半秒钟。
"调试>窗口>线程"调试器窗口揭示了不愉快的真相,并提供了为什么这些TP线程没有完成的很好提示,您可以看到它们的调用堆栈。

6
每个进程都有一个线程池。从 .NET Framework 4 开始,进程的线程池默认大小取决于多种因素,例如虚拟地址空间的大小。进程可以调用 GetMaxThreads 方法确定线程数。可以使用 SetMaxThreads 方法更改线程池中的线程数。每个线程使用默认堆栈大小并以默认优先级运行。
托管 .NET Framework 的非托管代码可以使用在 mscoree.h 文件中定义的 CorSetMaxThreads 函数来更改线程池的大小。

2

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


如果我的应用程序同时运行了30多个线程,将值设置为64是否太贪心? - Shamim Hafiz - MSFT
1
如果可能的话,我会让.NET框架决定适当的线程数量。它应该自动尝试选择线程数以优化吞吐量。 - paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接