C# 同步Web Api和响应时间取决于线程和请求计数

C# 同步Web Api和响应时间取决于线程和请求计数,c#,.net,asp.net-core,asp.net-web-api,synchronous,C#,.net,Asp.net Core,Asp.net Web Api,Synchronous,为了更好地学习sync/async,我把它们弄乱了,遇到了一件我无法解释的事情。我已经用两个端点设置了WebAPI项目,它们从数据库中读取数据。一个是同步的,另一个是异步的。两者都执行相同的操作,在数据库端大约需要5秒(有意限制)。此外,我还在线程方面限制了web服务器: ThreadPool.SetMinThreads(2, 2); ThreadPool.SetMaxThreads(2, 2); 我担心同步方法的行为,异步的工作方式和我期望的一样 当我同时向synchronous端点发送3个

为了更好地学习sync/async,我把它们弄乱了,遇到了一件我无法解释的事情。我已经用两个端点设置了WebAPI项目,它们从数据库中读取数据。一个是同步的,另一个是异步的。两者都执行相同的操作,在数据库端大约需要5秒(有意限制)。此外,我还在线程方面限制了web服务器:

ThreadPool.SetMinThreads(2, 2);
ThreadPool.SetMaxThreads(2, 2);
我担心同步方法的行为,异步的工作方式和我期望的一样

当我同时向synchronous端点发送3个请求时,我在5秒内得到2个响应,在10秒内得到1个响应,这在我看来是合乎逻辑的:

然而,当我同时向同步端点发送4个请求时,我最终得到4个响应,这些响应都需要10秒(但我预计2个是5秒,另外2个是10秒)

在web服务器日志中,我看到这4个请求实际上是同步处理的,响应时间约为5秒:


信息:Microsoft.AspNetCore.Hosting.Diagnostics[1]
请求启动HTTP/1.1 GEThttp://localhost:57128/test/syncDb  
信息:Microsoft.AspNetCore.Hosting.Diagnostics[1]
请求启动HTTP/1.1 GEThttp://localhost:57128/test/syncDb  
信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
正在执行端点“WebApiAsyncAwait.Controllers.TestController.GetSyncDb(WebApiAsyncAwait)”
信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
正在执行端点“WebApiAsyncAwait.Controllers.TestController.GetSyncDb(WebApiAsyncAwait)”
信息:Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[3]
与{action=“GetSyncDb”,controller=“Test”}匹配的路由。在控制器WebApiAsyncAwait.Controllers.TestController(WebApiAsyncAwait)上使用签名System.String GetSyncDb()执行控制器操作。
信息:Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[3]
与{action=“GetSyncDb”,controller=“Test”}匹配的路由。在控制器WebApiAsyncAwait.Controllers.TestController(WebApiAsyncAwait)上使用签名System.String GetSyncDb()执行控制器操作。
信息:Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor[1]
执行ObjectResult,写入类型为“System.String”的值。
信息:Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor[1]
执行ObjectResult,写入类型为“System.String”的值。
信息:Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[2]
在5008.3885ms中执行了操作WebApiAsyncAwait.Controllers.TestController.GetSyncDb(WebApiAsyncAwait)
信息:Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[2]
在5010.47200000001ms中执行了操作WebApiAsyncAwait.Controllers.TestController.GetSyncDb(WebApiAsyncAwait)
信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
已执行的终结点“WebApiAsyncAwait.Controllers.TestController.GetSyncDb(WebApiAsyncAwait)”
信息:Microsoft.AspNetCore.Hosting.Diagnostics[2]
请求以5026.9979ms 200文本/纯文本完成;字符集=utf-8
信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
已执行的终结点“WebApiAsyncAwait.Controllers.TestController.GetSyncDb(WebApiAsyncAwait)”
信息:Microsoft.AspNetCore.Hosting.Diagnostics[2]
请求以5032.421200000001ms 200文本/纯文本完成;字符集=utf-8
信息:Microsoft.AspNetCore.Hosting.Diagnostics[1]
请求启动HTTP/1.1 GEThttp://localhost:57128/test/syncDb  
信息:Microsoft.AspNetCore.Hosting.Diagnostics[1]
请求启动HTTP/1.1 GEThttp://localhost:57128/test/syncDb  
信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
正在执行端点“WebApiAsyncAwait.Controllers.TestController.GetSyncDb(WebApiAsyncAwait)”
信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
正在执行端点“WebApiAsyncAwait.Controllers.TestController.GetSyncDb(WebApiAsyncAwait)”
信息:Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[3]
与{action=“GetSyncDb”,controller=“Test”}匹配的路由。在控制器WebApiAsyncAwait.Controllers.TestController(WebApiAsyncAwait)上使用签名System.String GetSyncDb()执行控制器操作。
信息:Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[3]
与{action=“GetSyncDb”,controller=“Test”}匹配的路由。在控制器WebApiAsyncAwait.Controllers.TestController(WebApiAsyncAwait)上使用签名System.String GetSyncDb()执行控制器操作。
信息:Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor[1]
执行ObjectResult,写入类型为“System.String”的值。
信息:Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor[1]
执行ObjectResult,写入类型为“System.String”的值。
信息:Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[2]
在5007.105500000001ms中执行了操作WebApiAsyncAwait.Controllers.TestController.GetSyncDb(WebApiAsyncAwait)
信息:Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[2]
在5005.6482000000005ms中执行了操作WebApiAsyncAwait.Controllers.TestController.GetSyncDb(WebApiAsyncAwait)
信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
已执行的终结点“WebApiAsyncAwait.Controllers.TestController.GetSyncDb(WebApiAsyncAwait)”
信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
已执行的终结点“WebApiAsyncAwait.Controllers.TestController.GetSyncDb(WebApiAsyncAwait)”
信息:Microsoft.AspNetCore.Hosting.Diagnostics[2]
请求以5021.8341ms 200文本/纯文本完成;字符集=utf-8
信息:Microsoft.AspNetCore.Hosting.Diagnostics[2]
请求在5023.8319ms 200文本/纯文本中完成;字符集=utf-8

在ASP.NET内核中,有许多异步内容在幕后执行。特别是,在执行控制器操作之前,线程必须读取并解析fiddler发送的HTTP请求。在操作执行之后,另一个线程(m