使用MVC5asynchronous的优势是什么?

有什么区别:

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); } 

我看到,MVC代码现在有asynchronous,但有什么区别。 一个人比另一个人有更好的performance吗? debugging一个比另一个更容易吗? 我应该更改其他控制器为我的应用程序添加asynchronous吗?

只有在执行远程服务器调用等I / O绑定操作时,asynchronous操作才有用。 asynchronous调用的好处是在I / O操作期间,不使用ASP.NET工作线程。 那么这里是第一个例子的工作原理:

  1. 当请求到达动作时,ASP.NET从线程池中取出一个线程并开始执行它。
  2. IdentityManager.Authentication.CheckPasswordAndSignIn方法被调用。 这是一个阻塞调用 – >在整个调用过程中,工作线程正在受到危害。

以下是第二个电话的工作原理:

  1. 当请求到达动作时,ASP.NET从线程池中取出一个线程并开始执行它。
  2. IdentityManager.Authentication.CheckPasswordAndSignInAsync被调用,立即返回。 一个I / O完成端口被注册,ASP.NET工作线程被释放到线程池中。
  3. 稍后当操作完成时,会发出I / O完成端口信号,从线程池中绘制另一个线程以完成返回视图。

正如您在第二种情况中所看到的,ASP.NET工作线程仅在短时间内使用。 这意味着池中有更multithreading可用于其他请求。

所以,总结一下,只有当你有一个真正的asynchronousAPI里面使用asynchronous操作。 如果你在一个asynchronous操作中进行阻塞调用,那么你正在杀死它的全部好处。

通常,单个HTTP请求将由单个线程处理,从池中彻底删除该线程,直到返回响应。 通过TPL,您不受这个限制。 任何进来的请求都会开始计算每个计算单元的延续,以计算能够在池中的任何线程上执行的响应。 使用这个模型,你可以处理比标准的ASP.Net更多的并发请求。

如果这是一个新的任务,是否会产生,是否应该等待。 总是考虑那些70毫秒,这是约。 最大。 任何方法调用应该采取的时间。 如果它的时间更长,那么你的用户界面很可能不会觉得响应速度很快。