如果我们在单一操作中运行,那么使用异步操作的目的是什么?

时间:2015-10-30 12:24:55

标签: c# asp.net-mvc

如果我们有单一操作的操作,那么使用异步操作的目的是什么?此操作长时间运行但仍然是一个操作。我经常在文章中看到(例如在文章中: 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;
    }
}

如果我们有两个或更多长时间运行的操作,但是如果我们有一个操作,我理解的目的是什么?如果我们执行一个操作,则异步操作与同步操作同时运行。

2 个答案:

答案 0 :(得分:3)

await表达式不像同步调用那样阻塞。它强制编译器在稍后的某个时间点对等待的任务进行继续(当任务完成时,它将从中断处继续)。

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

对于WebAPI,您可以释放IIS'线程池来处理请求并执行其他处理。

答案 1 :(得分:0)

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

在您的示例中,好处不太明确,因为长时间运行的操作最终会释放ASP.NET工作线程,只能在不同的工作线程上恢复。