使用Await顺序调用异步任务的优势是什么?

时间:2014-01-20 16:13:03

标签: c# .net asynchronous task-parallel-library async-await

在仔细阅读Visual Studio 2013创建的AccountController代码时。我看到每个调用执行等待的异步方法的顺序调用模式。

public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl){
  if (User.Identity.IsAuthenticated){
    return RedirectToAction("Manage");
  }

  if (ModelState.IsValid){
    // Get the information about the user from the external login provider
    var info = await AuthenticationManager.GetExternalLoginInfoAsync();
    if (info == null){
      return View("ExternalLoginFailure");
   }

   var user = new ApplicationUser() { UserName = model.UserName };
   var result = await UserManager.CreateAsync(user);
   if (result.Succeeded){
     result = await UserManager.AddLoginAsync(user.Id, info.Login);
     if (result.Succeeded){
       await SignInAsync(user, isPersistent: false);
       return RedirectToLocal(returnUrl);
      }
   }
   AddErrors(result);
 }

 ViewBag.ReturnUrl = returnUrl;
 return View(model);
}

我看不到这种等待 - 异步模式有什么优势吗? await运算符进行这些阻塞调用,这使得它们基本上是老式的同步调用。

答案

由于缺乏声誉我还不能回答我自己的问题,但我找到了答案here,而我在发帖之前进行了搜索,我错过了。调用是阻塞的,我错过了,并且在文档中一点都不清楚,ASP.NET是否在阻塞期间将当前工作线程返回到ASP.NET线程池。

进一步阅读 TAP(基于任务的异步模式)是.NET Framework中的新模式异步。 Here链接到模式的更多信息,而不是大多数人想要消化的信息。

2 个答案:

答案 0 :(得分:6)

调用async方法不会阻止任何操作。但是,代码看起来像是同步的。 async方法返回表示异步操作的任务。操作结束时任务结束。

await的作用基本上是将所有代码注册为延续。它将在操作结束时运行。它没有被阻止,它将在需要运行时被调用。那里有很大的不同。

例如,当我调用Web服务并打印结果时。当然我不能打印我没有的东西,但是不是调用服务并等待结果,而是调用服务并告诉它如何处理结果(打印)。

答案 1 :(得分:-2)

在上述代码中使用await的优点是ASP.NET工作线程在'await'ed操作期间返回到池,从而允许更多的可伸缩性。

来自Microsoft的

Document关于Microsoft在TAP上的详细信息(基于任务的异步模式)。它用于表示任意异步操作,并且每个文档都将弃用异步编程模型(APM)和先前.NET框架的基于事件的异步模式(EAP)模式。