是否所有Web请求都是并行执行的并且是异步处理的?

时间:2014-05-24 13:37:23

标签: c# asp.net multithreading asynchronous asp.net-web-api

我正在使用由IIS托管的WebApi服务控制器, 我试图了解这种架构是如何运作的:

  1. 当WebPage客户端同时发送异步请求时,是否所有这些请求都是在WebApi控制器上并行执行的?

  2. 在IIS应用程序池中,我注意到队列大小设置为1,000默认值 - 这是否意味着1,000个最大线程可以同时在WebApi服务器上并行工作? 或者此值仅与IIS队列相关?

  3. 我读过IIS维护某种线程队列,这个队列是异步发送它的工作吗?或者IIS发送给WebApi服务的所有客户端请求是否同步发送?

2 个答案:

答案 0 :(得分:3)

是的,所有请求都将使用来自CLR线程池的线程并行执行。关于针对应用程序池设置的队列大小,此限制是IIS开始拒绝具有503 - 服务不可用状态代码的请求。即使在此之前,您的请求也将由IIS / ASP.NET排队。那是因为无法随意创建线程。可以运行的并发请求数量受限于MaxConcurrentRequestsPerCPU和一些其他参数。要真正意义上并行执行1000个线程,您将需要1000个CPU内核。否则,线程将需要时间切片,这会增加系统的开销。因此,线程数有限制。我认为通过这里的单一答案全面回答您的问题非常困难。您可能需要阅读一点,一个好的起点将是http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx

答案 1 :(得分:3)

您正在查看的队列大小指定将为每个应用程序池排队的最大请求数(通常映射到一个w3wp工作进程)。一旦超过队列长度,将返回503“Server Too Busy”错误。

在每个工作进程中,可以/将运行多个线程。每个请求都在工作进程内的一个线程上运行(默认情况下,每个进程默认最多250个线程)。

因此,基本上,每个请求都在其自己的线程上处理(并发 - 至少,与线程一样同时),但特定应用程序池的所有线程(通常)由单个管理处理。这意味着,就请求本身而言,请求实际上是异步执行的。

回应你的评论;如果您启用了会话(您可能会这样做),那么ASP.NET将对请求进行排队,以便为每个请求保持对会话的锁定。尝试在Chrome中点击您的睡眠操作,然后在Firefox中快速响应操作,看看会发生什么。您应该看到两个不同的会话允许您的请求同时执行。

相关问题