104

是什麼區別:使用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?

+0

在絕大多數情況下,在MVC中使用異步沒有什麼好處,但有很多不利因素。 –

回答

153

只有在執行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完成端口的信號,另一個線程將從線程池中提取以完成返回視圖。

正如您在第二種情況中所看到的,ASP.NET工作線程僅用於很短的時間。這意味着池中有更多線程可用於服務其他請求。

所以得出結論,只有當你有一個真正的異步API裏面才使用異步操作。如果您在異步操作中進行阻止呼叫,則可能會造成整體效益。

+0

上下文同步如何?這不會是一個這樣的開銷,你根本不想使用異步操作嗎? 「實際異步執行的異步方法的開銷完全取決於 是否需要使用SynchronizationContext.Post來切換線程,如果它是 ,那麼開銷將由它在恢復時執行的線程切換控制,即 意味着當前的SynchronizationContext有很大的不同。「 (C#5.0中的異步,2012,Alex Davies) – annemartijn

+1

@Darin爲什麼釋放主線程如此重要?線程是否受限? – Omtechguy

+1

@Omtechguy yes請求線程有一定的限制 –

1

通常,單個HTTP請求將由單個線程處理,從池中完全刪除該線程,直到返回響應。通過TPL,您不受這個限制。任何進來的請求都會開始計算每個計算單元的延續,以計算能夠在池中的任何線程上執行的響應。使用這個模型,您可以處理比標準ASP.Net更多的併發請求。

如果它是一些新的任務將被產生,或不是,以及是否應該等待。總是考慮那些70毫秒,這是約。最大。任何方法調用應該採取的時間。如果時間更長,那麼你的用戶界面很可能不會覺得響應速度很快。

0

在啓動時看到大量併發請求或突發性加載(併發性突然增加)的Web應用程序中,使這些Web服務調用異步將提高應用程序的響應速度。異步請求需要花費與同步請求相同的時間進行處理。例如,如果請求發出的Web服務調用需要兩秒鐘完成,則無論是同步還是異步執行,請求都需要兩秒鐘。但是,在異步調用期間,線程在等待第一個請求完成時不會阻止對其他請求的響應。因此,當有許多調用長時間運行的併發請求時,異步請求會阻止請求排隊和線程池增長。