使用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工作线程。 那么这里是第一个例子的工作原理:
- 当请求到达动作时,ASP.NET从线程池中取出一个线程并开始执行它。
-
IdentityManager.Authentication.CheckPasswordAndSignIn
方法被调用。 这是一个阻塞调用 – >在整个调用过程中,工作线程正在受到危害。
以下是第二个电话的工作原理:
- 当请求到达动作时,ASP.NET从线程池中取出一个线程并开始执行它。
-
IdentityManager.Authentication.CheckPasswordAndSignInAsync
被调用,立即返回。 一个I / O完成端口被注册,ASP.NET工作线程被释放到线程池中。 - 稍后当操作完成时,会发出I / O完成端口信号,从线程池中绘制另一个线程以完成返回视图。
正如您在第二种情况中所看到的,ASP.NET工作线程仅在短时间内使用。 这意味着池中有更multithreading可用于其他请求。
所以,总结一下,只有当你有一个真正的asynchronousAPI里面使用asynchronous操作。 如果你在一个asynchronous操作中进行阻塞调用,那么你正在杀死它的全部好处。
通常,单个HTTP请求将由单个线程处理,从池中彻底删除该线程,直到返回响应。 通过TPL,您不受这个限制。 任何进来的请求都会开始计算每个计算单元的延续,以计算能够在池中的任何线程上执行的响应。 使用这个模型,你可以处理比标准的ASP.Net更多的并发请求。
如果这是一个新的任务,是否会产生,是否应该等待。 总是考虑那些70毫秒,这是约。 最大。 任何方法调用应该采取的时间。 如果它的时间更长,那么你的用户界面很可能不会觉得响应速度很快。