ThreadPool SetMaxThreads和SetMinThreads Magic Number

Ben*_*nny 31 c# threadpool

是否有一个神奇的数字或公式来设置ThreadPool的SetMaxThreads和SetMinThreads的值?我有成千上万个需要执行的长时间运行方法,但却无法找到设置这些值的完美匹配.任何建议将不胜感激.

Han*_*ant 46

默认的最小线程数是您的计算机具有的核心数.这是一个很好的数字,运行更多的线程通常没有核心.

默认的最大线程数是.NET 2.0 SP1及更高版本的核心数的250倍.这里有很大的喘息空间.在四核机器上,如果没有一个线程在合理的时间内完成,则需要499秒才能达到该最大值.

线程池调度程序尝试将活动线程数限制为最小值,默认情况下为您拥有的核心数.如果活动线程没有完成,它会再次启动一个线程.运行很长时间或执行大量阻塞但不是由I/O引起的线程不适合线程池.您应该使用常规线程.

达到最大值并不健康.在四核计算机上,只需这些线程的堆栈就会消耗一千兆字节的虚拟内存空间.很有可能获得OOM.如果这是您的问题,请考虑降低最大线程数.或者考虑从一个线程安全队列中开始接收一些工作包的常规线程.

  • @Hans Passant:这几乎是正确的,首先默认的最大线程数取决于应用程序使用的.NET Framework版本(例如,2.0中的每个核心25个).第二件事是增加最小线程数导致线程能够无延迟地启动,直到达到最小数量(如果不需要它们将不会启动).如果达到最小延迟,则只会在中间延迟创建新线程,从而导致长操作(> 500ms)的性能提升,但是短操作的性能下降. (3认同)

Ree*_*sey 8

通常,神奇的数字是不管它.ThreadPool可以很好地处理这个问题.

话虽这么说,如果你正在做很多长时间运行的服务,并且那些服务将有很长的等待时间,你可能想要增加最大线程来处理更多选项.(如果进程没有阻塞,那么如果增加线程数,你可能只会减慢速度......)

分析您的应用程序以找到正确的数字.

  • 这是一个不同的问题 - 你可以通过限制来减少工作量,但内存耗尽实际上与线程无关...... (3认同)

Mic*_*ray 6

如果您想要更好的控制,您可能需要考虑不使用内置的ThreadPool.在http://www.codeproject.com/KB/threads/smartthreadpool.aspx上有一个很好的替代品.