C# 是否所有web请求都是并行执行并异步处理的?

C# 是否所有web请求都是并行执行并异步处理的?,c#,asp.net,multithreading,asynchronous,asp.net-web-api,C#,Asp.net,Multithreading,Asynchronous,Asp.net Web Api,我正在使用由IIS托管的WebApi服务控制器, 我试图了解这种体系结构是如何工作的: 当网页客户端同时发送异步请求时,所有这些请求是否在WebApi控制器上并行执行 在IIS应用程序池中,我注意到队列大小设置为1000个默认值-这是否意味着在WebApi服务器上可以同时并行工作1000个最大线程? 或者此值仅与IIS队列相关 我读到IIS维护某种线程队列,这个队列是否异步发送其工作?或者IIS发送到WebApi服务的所有客户端请求都是同步发送的 是的,所有请求都将使用CLR线程池中受限制的线程

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

  • 当网页客户端同时发送异步请求时,所有这些请求是否在WebApi控制器上并行执行

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

  • 我读到IIS维护某种线程队列,这个队列是否异步发送其工作?或者IIS发送到WebApi服务的所有客户端请求都是同步发送的


  • 是的,所有请求都将使用CLR线程池中受限制的线程并行执行。关于针对应用程序池设置的队列大小,此限制用于IIS开始拒绝具有503-服务不可用状态代码的请求。即使在这种情况发生之前,您的请求也将由IIS/ASP.NET排队。这是因为线程不能随意创建。可以运行的并发请求数量有一个限制,该限制由MaxConcurrentRequestsPerCPU和一些其他参数设置。要使1000个线程真正并行执行,您需要1000个CPU核。否则,线程将需要进行时间切片,这会增加系统开销。因此,线程的数量是有限制的。我相信在这里很难通过一个单一的答案来全面地回答您的问题。您可能需要读一点,最好从这里开始。

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

    在每个辅助进程中,可以/将运行多个线程。每个请求都在辅助进程内的一个线程上运行(我相信每个进程的默认线程数最多为250个)

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


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

    这是您几个问题的答案,非常感谢。但由于某些原因,在我们的WebApi服务中,在某个特定时间只处理一个请求。我尝试使用$.ajax(jquery)从web客户端(浏览器)发送3个请求,并在返回响应之前将其放入服务器控制器代码“Thread.Sleep”。我在调试中注意到,当处理第一个请求并在线程睡眠中等待时,下一个请求不会被处理,直到第一个请求完成等待并返回响应。是什么导致了这个问题?Tnx:)但我仍然不明白我的会话是如何启用的,你说的“在chrome中点击睡眠动作,然后在firefox中点击”是什么意思?此外,我在哪里可以禁用会话来检查我的请求是否会同时执行?这是WebApi、IIS还是Chrome配置(我们只使用Chrome浏览器)?但这超出了您最初问题的范围;如果您还有其他问题,请将其作为新问题发布。我已经发布了一个关于会话状态问题的新问题,如果您能在此处查看并回答,将不胜感激。Tnx:)