在仔细阅读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链接到模式的更多信息,而不是大多数人想要消化的信息。
答案 0 :(得分:6)
调用async
方法不会阻止任何操作。但是,代码看起来像是同步的。 async
方法返回表示异步操作的任务。操作结束时任务结束。
await
的作用基本上是将所有代码注册为延续。它将在操作结束时运行。它没有被阻止,它将在需要运行时被调用。那里有很大的不同。
例如,当我调用Web服务并打印结果时。当然我不能打印我没有的东西,但是不是调用服务并等待结果,而是调用服务并告诉它如何处理结果(打印)。
答案 1 :(得分:-2)
在上述代码中使用await的优点是ASP.NET工作线程在'await'ed操作期间返回到池,从而允许更多的可伸缩性。
来自Microsoft的Document关于Microsoft在TAP上的详细信息(基于任务的异步模式)。它用于表示任意异步操作,并且每个文档都将弃用异步编程模型(APM)和先前.NET框架的基于事件的异步模式(EAP)模式。