【问题标题】:why main thread don't return response immediately when I call async method?为什么我调用异步方法时主线程不立即返回响应?
【发布时间】:2017-11-16 01:21:25
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net async-await


    【解决方案1】:

    async-await 不会更改 HTTP 协议。请求到达服务器,服务器产生响应并发送给客户端。

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

    而且它不会使请求处理更快。恰恰相反。

    但它确实使用了更多的线程池线程,并使服务器在重负载下的响应速度更快。

    【讨论】:

    • 谢谢保罗·莫尔加多。我知道你说的。但是为什么相同的代码在不同的解决方案中有不同的响应时间呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多