在web.config中是不能修改 minWorkerThreads minIoThreads 的(Visual Studio 或 IIS 目录里),会报错:
说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。
分析器错误消息: 在 machine.config 文件之外使用注册为 allowDefinition='MachineOnly' 的节是错误的。
源错误:
只能在 machine.config 中修改,
如果是32位程序(应用程序池里开启了“启用 32 位应用程序”)则是:C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config
如果是64位程序则是:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config
<processModel autoConfig="true" minWorkerThreads="50" minIoThreads="50" />
要注意,配置文件里的数量要乘以CPU核心数。
比如你的CPU是6核,minWorkerThreads 设置为50,最终生效是 300 。
第二个注意点。
设置的上限不能超过最大线程数除以2,否则就会被还原成默认值。
比如:机器默认最大IO线程数设置为:1000。你手动设置最小IO线程数 ( minIoThreads*CPU数)为600,即:超过最大值的一半(1000/2) ,这时 minIoThreads 会被还原成默认值6 (CPU是6核)。
-
如果不想修改machine.config,也可以在程序里硬编码:
//如果SetMinThreads时,最小IO工作线程数大于最大IO线程数的一半,设置则会被还原成默认值。 ThreadPool.SetMinThreads(minWorkerThreads, minWorkerThreads);
硬编码就不用*CPU数了,设置多少是多少,但还是受一半的限制。
public static class GlobalThreadPool { public static void SetMinThreads(int minWorkerThreads) { int maxWorkerThreads; int maxCompletionPortThreads; ThreadPool.GetMaxThreads(out maxWorkerThreads, out maxCompletionPortThreads); //如果最小IO工作线程数大于最大IO线程数的一半,则会被还原成默认值 if (minWorkerThreads > (maxCompletionPortThreads / 2)) { minWorkerThreads = maxCompletionPortThreads / 2; } if (minWorkerThreads < 1) { throw new ArgumentOutOfRangeException("Thread count must be greater than zero."); } //如果SetMinThreads时,最小IO工作线程数大于最大IO线程数的一半,设置则会被还原成默认值。 ThreadPool.SetMinThreads(minWorkerThreads, minWorkerThreads); ThreadPool.GetMinThreads(out maxWorkerThreads, out maxCompletionPortThreads); Console.WriteLine("ThreadPool MinWorkerThreads: {0}, MinCompletionPortThreads: {1}", maxWorkerThreads, maxCompletionPortThreads); } }
-