我在新的Web应用程序中编写了一个测试代码,如下所示:
public ActionResult Index()
{
Logger.Write("start Index,threadId:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
MyMethodAsync(System.Web.HttpContext.Current.Request);//no await and has warning
Logger.Write("end Index,threadId:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
return View();
}
private async Task MyMethodAsync(HttpRequest request)
{
Logger.Write("start MyMethodAsync,threadId:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
await SomeMethodAsync(request);
Logger.Write("end MyMethodAsync,threadId:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
}
这是日志:
2017-11-15 19:55:31.904开始索引,threadId:35
2017-11-15 19:55:31.919启动MyMethodAsync,threadId:35
2017-11-15 19:55:31.919结束索引,threadId:35
2017-11-15 19:55:53.324结束MyMethodAsync,threadId:46
客户浏览者将在2017-11-15 19:55:32收到回复,这符合我的理解。在我的实际项目生产环境中,它写入与上面相同的日志,但是,客户端浏览器在大约22秒后在大约2017-11-15 19:55:54收到响应。似乎即使主线程完成工作,主线程也不会返回响应,直到新线程完成工作。
我已经调试了这个问题几天了。你能帮帮我吗?
答案 0 :(得分:0)
async-await
不会更改HTTP协议。请求进入服务器,服务器生成响应并将其发送给客户端。
它只是改变了ASP.NET处理ASP.NET请求的方式。
它并没有使请求处理更快。恰恰相反。
但它确实使用了更多的线程池线程,并使服务器在高负载下更具响应性。