2011-05-14 168 views
24

我有一些麻烦,.NET的线程池(.NET 4)。线程池最大线程

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

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

然而,当我设定在上述的一些任意高数,例如,2000和队列〜1000个项目,我仍然只有33〜线程中运行(.NET CLR花费〜5个线程),和ThreadPool.GetAvailableThreads()返回剩余的1971个线程。

为什么没有上述工作的代码?

+0

你是如何在线程池中排队的任务?显示你的测试代码可能真的有帮助。 –

+0

你的问题是,你应该运行_less_多于33个线程,而不是更多。 –

+0

@Henk Holterman,这不是一个大的应用程序 - 这是一个快速怪人在职HTTP负载生成我做了尝试,并加载本地Web服务器与一群请求。不幸的是它并没有那么好。 – foxy

回答

8

From the MSDN

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

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

+0

我排队〜50k任务,并将ThreadPool的最小+最大线程设置为20k,但只使用了约25个线程。这是预期的吗? – foxy

+0

是否有任何/任务完成或处于等待状态?由经理来创建线程。在某些机器上,没有太多线程可能会更好,因为线程会遭受线程匮乏。 –

1

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

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

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

+0

谢谢,我在Windows 7上使用.NET 4。 – foxy

65

首先,您的默认的“知识”是不正确。每个处理器25个线程的限制是从.NET 1.1返回的。这是在.NET 2,and now增加:

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

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

+1

这应该是公认的答案,它清楚地解释了自由和平正在经历的事情 – Fayilt

+1

这就是答案!我注意到奇怪的半秒钟,有时一秒钟,它什么都没做。我有等待任务和其他任务等待开始的结果,并且一切都很慢。我的工作需要大约10个线程。将ThreadPool.SetMinThreads设置为20(默认为8),工作线程立即解决了我的问题!因为我以后也需要这些线程,所以我不会再减少最小值。 – ygoe