C# 使用wait按顺序调用异步任务的优点是什么?

C# 使用wait按顺序调用异步任务的优点是什么?,c#,.net,asynchronous,task-parallel-library,async-await,C#,.net,Asynchronous,Task Parallel Library,Async Await,阅读Visual Studio 2013创建的AccountController代码时。我看到了异步方法的顺序调用模式,每个调用都执行wait public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl){ if (User.Identity.IsAuthenticated){ return Redi

阅读Visual Studio 2013创建的AccountController代码时。我看到了异步方法的顺序调用模式,每个调用都执行wait

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);
}
public async任务,虽然我在发布之前进行了搜索,但没有找到它。调用被阻塞了,我错过了,文档中根本不清楚的是,ASP.NET正在阻塞期间将当前工作线程返回到ASP.NET线程池

进一步阅读
TAP(基于任务的异步模式)是.NET框架中的新模式异步。是指向模式的更多信息的链接,而不是大多数人想要了解的内容。

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

wait
所做的是,它基本上将它之后的所有代码注册为一个延续。它将在操作结束时运行。它没有被阻止,需要运行时将调用它。这有很大的区别


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

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

wait
所做的是,它基本上将它之后的所有代码注册为一个延续。它将在操作结束时运行。它没有被阻止,需要运行时将调用它。这有很大的区别


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

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


来自Microsoft的详细信息来自Microsoft on-TAP(基于任务的异步模式)。它用于表示任意异步操作,根据本文档,将不推荐异步编程模型(APM)和基于事件的异步模式(EAP)以前.NET框架的模式。

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


来自Microsoft的详细信息来自Microsoft on-TAP(基于任务的异步模式)。它用于表示任意异步操作,根据本文档,它将反对以前.NET框架中的异步编程模型(APM)和基于事件的异步模式(EAP)模式。

“等待操作符进行这些阻塞调用”。这是导致你误解的错误陈述。请详细说明。上面用wait操作符调用的方法必须在代码继续之前完成,我会调用阻塞。我找到了答案,调用没有阻塞。MSDN帮助中不清楚的是,在阻塞过程中,当前ASP.NET工作线程被释放到池中,并且当异步调用完成时,将重新获取一个新的ASP.NET工作线程以继续。@Mikee,异步继续不是一个块,与thread.Sleep不同。相反,代码的执行状态保存到编译器生成的对象中,它只是停止执行,直到某个事件发生。打个比方,当你关上笔记本电脑的盖子,它进入休眠模式时,它是一个阻塞吗?“等待操作员发出这些阻塞呼叫”。这是导致你误解的错误陈述。请详细说明。上面用wait操作符调用的方法必须在代码继续之前完成,我会调用阻塞。我找到了答案,调用没有阻塞。MSDN帮助中不清楚的是,在阻塞过程中,当前ASP.NET工作线程被释放到池中,并且当异步调用完成时,将重新获取一个新的ASP.NET工作线程以继续。@Mikee,异步继续不是一个块,与thread.Sleep不同。相反,代码的执行状态保存到编译器生成的对象中,它只是停止执行,直到某个事件发生。打个比方,当你关上笔记本电脑的盖子,它进入休眠模式时,它是块吗?……我使用的术语阻塞可能是一个错误的选择,因为没有线程阻塞。如果我现在理解正确,wait运算符的作用是在“waiting”方法完成之前不允许继续执行语句。@Mikee并且必须理解控制权被传递回调用方(即ExternalLoginConfirmation的调用方继续在线程上执行且未被阻止).@Mikee这是真的,但是等待后的代码被描述为一个延续。这使我们更清楚地理解所有这些的异步性;“返回然后等待”是指用户界面在“阻塞”的同时,不断弹出一些小的移动微调器,用于处理需要时间的事情当UI总是完全冻结半秒,因为处理器根本不允许做任何其他事情……我使用术语阻塞可能是一个错误的选择,因为没有线程阻塞。如果我现在理解正确,wait运算符的作用是在'waiting'方法完成之前不允许继续执行语句。@Mikee并且理解控制权被传递回调用方(即Ex的调用方)是很重要的