2009-08-18 51 views

回答

9

你应该小心改变线程池的大小。只有一个固定系统线程池,用于各种事物。如果太小,可能会导致您甚至不认为自己正在使用的区域出现问题。

如果你想有一个特定的任务相对较少的线程池,你应该使用一个单独的游泳池。有各种各样的第三方池 - 我有一个相当老的作为MiscUtil的一部分,但它对于简单用例应该足够好。如果你看,我相信你可以找到更先进的。

这是不幸的,没有在框架中的实例化ThreadPool呢。我不记得是否并行扩展会有效提供一个,但我不认为它会。

+0

.NET 4.0中的并行扩展实际上将使用基类库中的标准ThreadPool。他们不会提供他们自己的。 (BCL的ThreadPool类在.NET 4中进行了改进,增加了许多功能,使得并行扩展能够高效地工作,这反过来又在很多方面改进了它,例如,它比.NET 3.5有更好的调度器ThreadPool) – 2009-08-18 18:12:28

+0

@Reed:是的,我知道使用系统线程池的PFX的正常位...我不确定是否有新的可以创建。呃,好吧。 – 2009-08-18 18:45:27

4
ThreadPool.SetMaxThreads() 
+0

有没有另外一种非静态的方法?这不会使所有的ThreadPools的大小 - 我只想要一个ThreadPool的实例具有特定的大小。 – DLauer 2009-08-18 16:09:08

+2

每个进程只有一个BCL ThreadPool。如果你只想要一个线程池,你必须找到第三方库。 – 2009-08-18 16:10:22

+0

它可能值得注意的是,你不能在运行时1.1中做到这一点。当然,线程中的异常可能导致1.1中的内存损坏,所以如果可能的话,你不应该使用它。 – quillbreaker 2009-08-18 17:12:41

0

ThreadPool.SetMaxThreads(5,5)然后超过五个线程的任何东西都会排队。

0

你想要ThreadPool.SetMaxThreads()方法。

4

您可以使用ThreadPool.SetMinThreadsThreadPool.SetMaxThreads来控制线程池中的线程数。

这就是说,我建议谨慎使用它。由于BCL中的许多操作都依赖于线程池线程,所以很容易让自己陷入麻烦。