在 MVC5中使用异步有什么好处?

两者的区别是什么:

public ActionResult Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
IdentityResult result = IdentityManager.Authentication.CheckPasswordAndSignIn(AuthenticationManager, model.UserName, model.Password, model.RememberMe);
if (result.Success)
{
return Redirect("~/home");
}
else
{
AddErrors(result);
}
}
return View(model);
}

以及:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
IdentityResult result = await IdentityManager.Authentication.CheckPasswordAndSignInAsync(AuthenticationManager, model.UserName, model.Password, model.RememberMe);
if (result.Success)
{
return Redirect("~/home");
}
else
{
AddErrors(result);
}
}
return View(model);
}

I see that the MVC code now has async but what is the difference. Does one give much better performance than the other? Is it easier to debug problems with one than the other? Should I make changes to other controllers for my application to add Async ?

50357 次浏览

只有在执行 I/O 绑定操作(如远程服务器调用)时,异步操作才有用。异步调用的好处是,在 I/O 操作期间,没有使用 ASP.NET 工作线程。第一个例子是这样的:

  1. When a request hits the action, ASP.NET takes a thread from the thread pool and starts executing it.
  2. 调用 IdentityManager.Authentication.CheckPasswordAndSignIn方法。这是一个阻塞调用-> 在整个调用期间,工作线程正在受到危害。

第二通电话是这样的:

  1. When a request hits the action, ASP.NET takes a thread from the thread pool and starts executing it.
  2. 调用立即返回的 IdentityManager.Authentication.CheckPasswordAndSignInAsync。注册一个 I/O 完成端口,并将 ASP.NET 工作线程释放到线程池。
  3. 稍后,当操作完成时,I/O Completion 端口被发出信号,从线程池中抽取另一个线程来完成返回视图。

正如您在第二种情况中看到的那样,ASP.NET 工作线程只用了很短的一段时间。这意味着池中有更多的线程可用于服务其他请求。

因此,总而言之,只有在内部有真正的异步 API 时才使用异步操作。如果在异步操作中进行阻塞调用,就会扼杀异步操作的全部好处。

通常,单个 HTTP 请求将由单个线程处理,完全从池中删除该线程,直到返回响应。对于 TPL,您不受此约束的约束。任何进入的请求都会启动一个延续,其中包含计算能够在池中任何线程上执行的响应所需的每个计算单元。使用这种模型,您可以处理比标准 ASP.Net 更多的并发请求。

如果它是一些新的任务,将产生,或没有,如果它应该等待或没有。总是想着那70毫秒,大约是。最大值。任何方法调用所需的时间。如果它更长,那么您的 UI 很可能不会感到非常响应。

在 Web 应用程序中,如果在启动时看到大量并发请求或者负载突然增加(并发性突然增加) ,使这些 Web 服务调用异步将增加应用程序的响应能力。异步请求的处理时间与同步请求相同。例如,如果一个请求发出一个需要两秒钟才能完成的 Web 服务调用,那么无论是同步执行还是异步执行,该请求都需要两秒钟。但是,在异步调用期间,线程在等待第一个请求完成时不会被阻止响应其他请求。因此,当有许多并发请求调用长时间运行的操作时,异步请求会阻止请求排队和线程池增长。