【问题标题】:What are the benefits of async and await in an ASP.Net MVC Action ControllerASP.Net MVC 动作控制器中异步和等待的好处是什么
【发布时间】:2021-01-29 22:20:37
【问题描述】:

我尝试了下面的代码,直到长时间运行的方法完成后才显示索引视图。如果我不使用 async 并 await 在显示索引视图之前也需要相同的时间。这让我现在想知道在 ASP.Net MVC 动作控制器中使用 async 和 await 有什么好处?

    public async Task<IActionResult> Index()
    {
        var result = await Task.Run(() => TestAsyncAndAwait());

        ViewBag.ResultFromAwait = result;

        return View();
    }

    public int TestAsyncAndAwait()
    {
        System.Threading.Thread.Sleep(1 * 60 * 1000);

        return 1;
    }

【问题讨论】:

    标签: asp.net-core


    【解决方案1】:

    我试过下面的代码

    首先,您不想使用伪异步代码进行测试。相反,请测试同步方法与其真正的异步方法之间的区别:

    public IActionResult Synchronous()
    {
      Thread.Sleep(1 * 60 * 1000);
      ViewBag.ResultFromAwait = 1;
      return View();
    }
    
    public async Task<IActionResult> Asynchronous()
    {
      await Task.Delay(1 * 60 * 1000);
      ViewBag.ResultFromAwait = 1;
      return View();
    }
    

    在长时间运行的方法完成之前,不会显示索引视图。如果我不使用 async 并等待它在显示索引视图之前也需要相同的时间。

    HTTP 是一种请求/响应协议。客户端发送请求,一段时间后服务器发送响应。 async 不会改变 HTTP 协议的工作方式。

    这让我现在想知道在 ASP.Net MVC 动作控制器中使用 async 和 await 有什么好处?

    asyncawait 不会屈服于 HTTP 客户端(它们不能,因为它们不会更改 HTTP 协议)。相反,它们屈服于线程池。这使您的 ASP.NET 服务器能够处理更多的并发请求。

    具体来说,对于同步示例(在问题和本答案中),一个 ASP.NET 线程在整个分钟内都被阻止执行 Sleep。但是,对于异步示例(在此答案中),没有使用 ASP.NET 线程来等待那一分钟。相反,async/await 允许该线程返回到 ASP.NET 线程池,当该分钟结束时,该线程池中的一个线程用于设置 ViewBag 值并返回 View() .因此,ASP.NET 服务器可以在一分钟内处理比其他情况更多的请求,因为它有一个额外的线程可用。

    问题中的伪异步示例没有具有这种行为。它不是异步等待,而是阻塞线程池线程,因此它的效率比同步解决方案的可伸缩性低。这是在 ASP.NET 上不鼓励使用 Task.Run 的原因之一。

    有关详细信息,请参阅this article

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2012-12-07
      • 1970-01-01
      • 2014-05-15
      • 2012-10-14
      • 2013-03-11
      • 2018-03-12
      • 1970-01-01
      相关资源
      最近更新 更多