如果我们有单一操作的操作,那么使用异步操作的目的是什么?此操作长时间运行但仍然是一个操作。我经常在文章中看到(例如在文章中: 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;
}
}
如果我们有两个或更多长时间运行的操作,但是如果我们有一个操作,我理解的目的是什么?如果我们执行一个操作,则异步操作与同步操作同时运行。
答案 0 :(得分:3)
await
表达式不像同步调用那样阻塞。它强制编译器在稍后的某个时间点对等待的任务进行继续(当任务完成时,它将从中断处继续)。
即使您只有一个操作,它也可以释放调用线程来执行其他操作。这在调用线程是UI线程的WinForms
或WPF
应用程序中会更明显,如果您没有await
,则会导致屏幕冻结。
对于WebAPI,您可以释放IIS'线程池来处理请求并执行其他处理。
答案 1 :(得分:0)
这个想法是你有一些有限数量的工作线程用于ASP.NET请求。即使您的请求只有一个长时间运行的操作,通常该操作也是IO绑定的(例如网络或数据库操作)。因此,您可以使用异步操作释放ASP.NET工作线程,以便在等待操作结果时为其他请求提供服务。
在您的示例中,好处不太明确,因为长时间运行的操作最终会释放ASP.NET工作线程,只能在不同的工作线程上恢复。