如果我们有单独的操作,那么使用异步操作的目的是什么

本文关键字:异步操作 是什么 我们有 单独 操作 如果 | 更新日期: 2023-09-27 18:19:58

如果我们有一个操作中的单一操作,那么使用异步操作的目的是什么?此操作已运行很长时间,但它仍然是一个操作。我经常在文章中看到(例如在文章中:http://www.asp.net/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4#CreatingAsynchGizmos)代码如下:

public class HomeController : AsyncController
{
    public async Task<ActionResult> Index()
    {
        int result = await Task.Factory.StartNew<int>(LongRunningOperation);
        ViewBag.Result = result;
        return View();
    }
    private int LongRunningOperation()
    {
        Thread.Sleep(50000);
        return 5;
    }
}

我理解如果我们有两个或更多的长期行动,但如果我们有一个行动,目的是什么?如果我们在操作中有一个操作,那么异步操作会像同步操作一样同时运行。

如果我们有单独的操作,那么使用异步操作的目的是什么

await表达式不会像同步调用那样阻塞。它强制编译器在稍后对等待的任务进行延续(当任务完成时,它会从停止的地方恢复)。

即使您只有一个操作,它也可以释放调用线程来做其他事情。这在WinFormsWPF应用程序中更为明显,其中调用线程是UI线程,如果没有await,则会导致屏幕冻结。

在WebAPI的情况下,您将释放IIS的线程池来处理请求和进行额外的处理。

我们的想法是,ASP.NET请求的工作线程数量有限。即使您的请求只有一个长期运行的操作,通常该操作是IO绑定的(例如网络或数据库操作)。因此,您可以使用异步操作释放ASP.NET工作线程,以便在等待操作结果时为其他请求提供服务。

在您的示例中,好处不太明显,因为长期运行的操作最终会释放ASP.NET工作线程,而只能在另一个工作线程上继续。