ASP.NET 不使用所有工作线程

标签 asp.net threadpool

看起来我的 ASP.NET 设置没有使用超过 10 个工作线程。我已遵循本文的建议但无济于事:http://support.microsoft.com/kb/821268 。我了解异步 Controller ,但在我们的例子中使用它们是不现实的。

我有以下 ASP.NET MVC 操作方法来测试线程争用:

public ActionResult Index()
{
    int workers;
    int io;

    ThreadPool.GetAvailableThreads(out workers, out io);

    Thread.Sleep(1000);

    return Content(workers.ToString());
}

它默认返回 399(线程池中 399 个未使用的线程 - 4 个处理器 * 100)。当我用 jmeter 加载这个方法时,我发现这个数字永远不会低于 390。我还看到,如果我有超过 10 个虚拟 session ,响应时间开始线性增加,也就是说,您可以清楚地观察到线程争用。如何强制 ASP.NET(或 .NET)使用更多线程池线程?

编辑: 当我将Thread.Sleep更改为await WebClient.DownloadStringTaskAsync(请求远程计算机http资源)后,情况变得更加有趣。现在,可用线程池线程的数量大多保持在 399 个(尽管一度达到 386 个)。这是预期的,因为 .NET 不需要进行计算。我还用 Stopwatch 包装了 action 方法,并发现该方法所花费的时间保持不变。 看起来这不是 .NET ThreadPool 问题,而是某些 IIS 或 ASP.NET 连接限制问题,尽管我在 Web.config 中看到以下内容:

  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="100" />
    </connectionManagement>
  </system.net>

最佳答案

看来我已经找到答案了。 Windows 客户端操作系统存在限制(我的操作系统最多 10 个请求),这基本上与我观察到的相符: http://www.jpelectron.com/sample/WWW%20and%20HTML/IIS-%20OS%20Version%20Limits.htm

关于ASP.NET 不使用所有工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21363855/

相关文章:

c# - 客户端字母多列(列表)排序和过滤

c# - Azure Service Fabric 错误 : Access is denied. 部署失败

asp.net - 打开一个没有任何关闭按钮的弹出窗口

c# - 针对非异步服务的异步编程

java - java 定时线程池

c# - 我可以在 ASP :Button? 的 Text 属性中放置一个 <span> 标签吗

php - Facebook 请求通过 cUrl 从 Https 转为 Http

java - 具有无界队列的 ThreadPoolExecutor 不创建新线程

c++ - 如何在旧版 C++ 上创建自己的线程池?

c# - 线程池中的事件线程数