c# - ThreadPool.SetMinThreads 在 IIS 托管应用程序中不起作用

标签 c# asp.net multithreading iis threadpool

我有一个设计为 Web API 的 ASP.NET 4.6 应用程序。它有一个长时间运行的操作,大约需要 60 秒,但是这个操作负载并不重,让我们想象一下 Thread.Sleep(60000)
该操作目前不能异步,因为它依赖于第三方非异步库,因此它会阻塞执行该操作的线程 60 秒。当超过 50 个请求同时发送到应用程序时,问题就变成了,新请求在队列中等待(有时多达 400 个)。我尝试像这样增加线程池线程的最小和最大数量:

ThreadPool.SetMinThreads(300, 300);
ThreadPool.SetMaxThreads(500, 500);

这些值已成功更改,如果我在 IIS Express 上运行应用程序,应用更改并很快分配新线程(大约 3 秒),所有请求都已处理,大家都很高兴:

the application hosted on IIS Express

但是,如果我在 IIS 10 上运行应用程序,它只会分配 40-60 个线程,其余请求正在排队:

the application hosted on IIS 10

如何在 IIS 托管应用程序中正确使用 ThreadPool.SetMinThreads
有没有其他方法可以达到同样的目的?

最佳答案

根本原因在于 IIS 对 Windows 10 企业版并发请求执行的限制:最多可以同时执行 10 个请求。实际上整个过程我有 46 个线程,只有 10 个线程来自线程池。当我尝试在 Windows Server 2012 上运行我的应用程序时,我没有遇到任何问题,因此在几秒钟内在线程池中创建了 400 个线程。

关于c# - ThreadPool.SetMinThreads 在 IIS 托管应用程序中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40549717/

相关文章:

c# - 上传到 Azure 后缺少 CSS 过渡效果

Java线程: Please clarify this understanding

c# - 加扰 XML 中的文本元素

c# - 如何从具有一些嵌入数据的 XML 文档填充 C# 类?

c# - 缓存页面但计算点击次数

asp.net - Web 配置转换不适用于 Visual Studio Online、VS2013 和 Azure

c# - Parallel.ForEach 期间使用的线程数

java - ExecutorService 未及时终止

c# - C# 中的 WeakReference - 操作实例是如何丢失的?

c# - Selenium webdriver c# 等待文本出现