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