作者:mks8896386 | 来源:互联网 | 2023-10-10 19:14
ThreadPool最大线程我在.NET的ThreadPool(.NET4)上遇到了一些麻烦。我已经读过默认情况下.NET每个处理器有25个线程的限制,但根据SO和其他地方的论坛p
ThreadPool最大线程
我在.NET的ThreadPool(.NET 4)上遇到了一些麻烦。
我已经读过默认情况下.NET每个处理器有25个线程的限制,但根据SO和其他地方的论坛post,我可以用下面的代码增加限制。
void SetThreads(int threads) { ThreadPool.SetMaxThreads(threads, threads); ThreadPool.SetMinThreads(threads, threads); }
但是,当我将上面的内容设置为某个任意高的数字(例如2000)和队列~1000个项目时,我仍然只运行~33个线程(.NET CLR需要约5个线程),而ThreadPool.GetAvailableThreads()
返回1971剩下的线程。
为什么上面的代码不起作用?
来自MSDN :
当需求较低时,线程池线程的实际数量可能会低于最小值。
阅读本文: 并行编程模式:使用.NET Framework理解和应用并行模式4
首先,您对默认值的“了解”是不正确的。 每个处理器25个线程的限制是从.NET 1.1返回的。 它在.NET 2中有所增加, 现在 :
从.NET Framework版本4开始,进程的线程池的默认大小取决于多个因素,例如虚拟地址空间的大小。 进程可以调用GetMaxThreads方法来确定线程数。
但是,还有其他的东西在起作用:线程池不会立即在所有情况下创建新线程。 为了应对小任务的爆发,它限制了创建新线程的速度。 IIRC,如果有未完成的任务,它将每0.5秒创建一个线程,最多为最大线程数。 我不能立即看到这个数字,但它可能会改变。 我强烈怀疑这是你所看到的。 尝试排队很多项目,然后监视一段时间内的线程数。
首先检查此链接 ,尤其是这句话:
如果托管公共语言运行库(例如,通过Internet信息服务(IIS)或SQL Server),则主机可以限制或阻止更改线程池大小。
然后你应该检查ThreadPool.SetMaxThreads(threads, threads)
方法的返回值。 也许它会返回false
?
上述就是C#学习教程:ThreadPool最大线程分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记