是否有一个神奇的数字或公式来设置ThreadPool的SetMaxThreads和SetMinThreads的值?我有成千上万个需要执行的长时间运行方法,但却无法找到设置这些值的完美匹配.任何建议将不胜感激.
Han*_*ant 46
默认的最小线程数是您的计算机具有的核心数.这是一个很好的数字,运行更多的线程通常没有核心.
默认的最大线程数是.NET 2.0 SP1及更高版本的核心数的250倍.这里有很大的喘息空间.在四核机器上,如果没有一个线程在合理的时间内完成,则需要499秒才能达到该最大值.
线程池调度程序尝试将活动线程数限制为最小值,默认情况下为您拥有的核心数.如果活动线程没有完成,它会再次启动一个线程.运行很长时间或执行大量阻塞但不是由I/O引起的线程不适合线程池.您应该使用常规线程.
达到最大值并不健康.在四核计算机上,只需这些线程的堆栈就会消耗一千兆字节的虚拟内存空间.很有可能获得OOM.如果这是您的问题,请考虑降低最大线程数.或者考虑从一个线程安全队列中开始接收一些工作包的常规线程.
通常,神奇的数字是不管它.ThreadPool可以很好地处理这个问题.
话虽这么说,如果你正在做很多长时间运行的服务,并且那些服务将有很长的等待时间,你可能想要增加最大线程来处理更多选项.(如果进程没有阻塞,那么如果增加线程数,你可能只会减慢速度......)
分析您的应用程序以找到正确的数字.
如果您想要更好的控制,您可能需要考虑不使用内置的ThreadPool.在http://www.codeproject.com/KB/threads/smartthreadpool.aspx上有一个很好的替代品.
| 归档时间: |
|
| 查看次数: |
27275 次 |
| 最近记录: |