ThreadPool最大线程数

时间:2011-05-14 09:04:59

标签: c# .net multithreading threadpool

我在使用.NET的ThreadPool(.NET 4)时遇到了一些麻烦。

我已经读过默认情况下.NET每个处理器有25个线程的限制,但根据SO和其他地方的论坛帖子,我可以使用下面的代码增加限制。

void SetThreads(int threads)
{
    ThreadPool.SetMaxThreads(threads, threads);
    ThreadPool.SetMinThreads(threads, threads);
}

但是,当我将上面的内容设置为某个任意高的数字(例如2000)和队列~1000个项目时,我仍然只有~33个线程在运行(.NET CLR需要约5个线程),{{1}返回1971个剩余的线程。

为什么上面的代码不起作用?

3 个答案:

答案 0 :(得分:78)

首先,您对默认值的“了解”是不正确的。每个处理器25个线程的限制是从.NET 1.1回来的。它在.NET 2中增加了and now

  

从.NET Framework版本4开始,进程的线程池的默认大小取决于多个因素,例如虚拟地址空间的大小。进程可以调用GetMaxThreads方法来确定线程数。

然而,还有其他的东西在起作用:线程池不会立即在所有情况下创建新线程。为了应对小任务的爆发,它限制了创建新线程的速度。 IIRC,如果有未完成的任务,它将每0.5秒创建一个线程,直到最大线程数。我不能立即看到这个数字,但它可能会改变。我强烈怀疑这是你所看到的。尝试排队很多项目,然后监视线程数量。

答案 1 :(得分:8)

From the MSDN

  

当需求低时,线程池线程的实际数量可能会下降   低于最低值。

另请阅读:Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4

答案 2 :(得分:1)

首先检查this link,尤其是这句话:

  

如果托管公共语言运行库,例如通过Internet托管   信息服务(IIS)或SQL Server,主机可以限制或   防止更改线程池大小。

然后你应该检查ThreadPool.SetMaxThreads(threads, threads)方法的返回值。也许它会返回false