当我调用异步方法时,主线程为什么不立即返回响应?

时间:2017-11-15 13:36:29

标签: asp.net async-await

我在新的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收到响应。似乎即使主线程完成工作,主线程也不会返回响应,直到新线程完成工作。

我已经调试了这个问题几天了。你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

async-await不会更改HTTP协议。请求进入服务器,服务器生成响应并将其发送给客户端。

它只是改变了ASP.NET处理ASP.NET请求的方式。

它并没有使请求处理更快。恰恰相反。

但它确实使用了更多的线程池线程,并使服务器在高负载下更具响应性。