设置ThreadPool的SetMaxThreads和SetMinThreads的值是否有一个神奇的数字或公式?我有成千上万个需要执行的长时间运行的方法,但找不到这些值的完美匹配。任何建议将不胜感激。
设置ThreadPool的SetMaxThreads和SetMinThreads的值是否有一个神奇的数字或公式?我有成千上万个需要执行的长时间运行的方法,但找不到这些值的完美匹配。任何建议将不胜感激。
默认的最小线程数为您的机器核心数量。这是一个不错的数字,通常没有必要运行超过核心数量的线程。
默认的最大线程数在.NET 2.0 SP1及以上版本中为核心数量的250倍。这里有很大的空间。在四核机器上,如果没有任何线程在合理的时间内完成,则需要499秒才能达到该最大值。
线程池调度程序尝试将活动线程数限制为最小值,默认情况下为您的核心数量。每秒钟允许一个额外的线程启动,如果活动线程没有完成。运行时间很长或执行了很多不是由I/O引起的阻塞的线程不适合使用线程池。应该使用普通的线程。
达到最大值并不健康。在四核机器上,仅这些线程的堆栈就会消耗1GB的虚拟内存空间。非常有可能发生OOM。如果这是您的问题,请考虑降低最大线程数。或者考虑仅启动一些普通线程,从线程安全队列接收工作包。
如果您希望更好地控制,可以考虑不使用内置的线程池。这里有一个不错的替代方案:http://www.codeproject.com/KB/threads/smartthreadpool.aspx。