Asp.net-Mvc

將非同步與 MVC5 一起使用有什麼好處?

  • September 30, 2013

有什麼區別:

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 工作執行緒。下面是第一個範例的工作原理:

  1. 當請求命中操作時,ASP.NET 從執行緒池中獲取一個執行緒並開始執行它。
  2. IdentityManager.Authentication.CheckPasswordAndSignIn方法被呼叫。這是一個阻塞呼叫 -> 在整個呼叫期間,工作執行緒受到威脅。

以下是第二個呼叫的工作方式:

  1. 當請求命中操作時,ASP.NET 從執行緒池中獲取一個執行緒並開始執行它。
  2. IdentityManager.Authentication.CheckPasswordAndSignInAsync呼叫並立即返回。註冊 I/O 完成埠並將 ASP.NET 工作執行緒釋放到執行緒池。
  3. 稍後當操作完成時,I/O Completion 埠發出信號,從執行緒池中抽取另一個執行緒完成返回視圖。

正如您在第二種情況下看到的那樣,ASP.NET 工作執行緒僅在短時間內使用。這意味著池中有更多執行緒可用於服務其他請求。

所以總結一下,只有當你有一個真正的非同步 API 時才使用非同步操作。如果您在非同步操作中進行阻塞呼叫,您將扼殺牠的全部好處。

引用自:https://stackoverflow.com/questions/19087513