澄清线程池最大线程

Roy*_*mir 18 c# asp.net .net-4.0 threadpool

我在这里读到:

在v2.0,3.5和4.0中,ASP.NET 初始化每个处理器(核心)100个线程的CLR ThreadPool

这是正确的,我检查了它(我有8个核心机器,所以8*100 = 800):

在此输入图像描述

但后来我看到了这个这个:

maxWorkerThreads - 基于每个CPU配置进程使用的最大工作线程数.此属性的范围来自5 through 100.默认值20.

我不知道数字如何适合这里:

第一段说明每个核心最多有100个线程(图像证明了它,我有8个核心).

但第二段指出每个核心的默认最大工作线程数为20.因此,如果我有8个核心,那么我必须有8*20 = 160个最大线程. 不是 800.

有人可以光明吗?

更新:

我刚刚找到了一种通过c#代码获取关键元素值的方法:

在此输入图像描述

所以现在数字适合,但仍然 - MSDN说默认值是20,而不是100

在此输入图像描述

然后他们确实提到了100:

在此输入图像描述

是怎么回事?

And*_*nov 10

我查看了源代码,发现默认值MaxWorkerThreads设置为100

private static readonly ConfigurationProperty _propMaxWorkerThreads = new ConfigurationProperty("maxWorkerThreads", typeof (int), (object) 100, (TypeConverter) null, (ConfigurationValidatorBase) new IntegerValidator(1, 2147483646), ConfigurationPropertyOptions.None);
Run Code Online (Sandbox Code Playgroud)

此字段将添加到静态构造函数中的属性集合中

ProcessModelSection._properties.Add(ProcessModelSection._propMaxWorkerThreads);
Run Code Online (Sandbox Code Playgroud)

在属性定义中,它们将默认值设置为20

[IntegerValidator(MaxValue = 2147483646, MinValue = 1)]
[ConfigurationProperty("maxWorkerThreads", DefaultValue = 20)]
public int MaxWorkerThreads
Run Code Online (Sandbox Code Playgroud)

但这显然没有效果.也许这是某种遗留实施.顺便说一下,只有当autoConfig设置为false时,它才会以这种方式运行.当它设置为true时,我的应用程序中有32K工作线程.可能这种行为取决于IIS版本.

  • `ThreadPool.GetMaxThreads`没有给你在线程池中创建的线程数.这是可以创建的许多线程.尝试检查你的app内存占用.每个分配的线程在内存中大约需要1MB.我不认为你的应用程序在开始时消耗1GB. (2认同)