Asp.net-Mvc
將非同步與 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); }我看到 MVC 程式碼現在有非同步但有什麼區別。一個提供比另一個更好的性能嗎?調試一個問題比另一個更容易嗎?我應該對其他控制器進行更改以使我的應用程序添加 Async 嗎?
僅當您執行 I/O 綁定操作(例如遠端伺服器呼叫)時,非同步操作才有用。非同步呼叫的好處是在 I/O 操作期間,不使用 ASP.NET 工作執行緒。下面是第一個範例的工作原理:
- 當請求命中操作時,ASP.NET 從執行緒池中獲取一個執行緒並開始執行它。
- 該
IdentityManager.Authentication.CheckPasswordAndSignIn方法被呼叫。這是一個阻塞呼叫 -> 在整個呼叫期間,工作執行緒受到威脅。以下是第二個呼叫的工作方式:
- 當請求命中操作時,ASP.NET 從執行緒池中獲取一個執行緒並開始執行它。
- 被
IdentityManager.Authentication.CheckPasswordAndSignInAsync呼叫並立即返回。註冊 I/O 完成埠並將 ASP.NET 工作執行緒釋放到執行緒池。- 稍後當操作完成時,I/O Completion 埠發出信號,從執行緒池中抽取另一個執行緒完成返回視圖。
正如您在第二種情況下看到的那樣,ASP.NET 工作執行緒僅在短時間內使用。這意味著池中有更多執行緒可用於服務其他請求。
所以總結一下,只有當你有一個真正的非同步 API 時才使用非同步操作。如果您在非同步操作中進行阻塞呼叫,您將扼殺牠的全部好處。