2014-01-20 26 views
1

在仔細閱讀由Visual Studio 2013創建的AccountController代碼時,我看到了每次調用都執行await的順序調用異步方法的模式。使用等待按順序調用異步任務的優勢是什麼?

public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl){ 
    if (User.Identity.IsAuthenticated){ 
    return RedirectToAction("Manage"); 
    } 

    if (ModelState.IsValid){ 
    // Get the information about the user from the external login provider 
    var info = await AuthenticationManager.GetExternalLoginInfoAsync(); 
    if (info == null){ 
     return View("ExternalLoginFailure"); 
    } 

    var user = new ApplicationUser() { UserName = model.UserName }; 
    var result = await UserManager.CreateAsync(user); 
    if (result.Succeeded){ 
    result = await UserManager.AddLoginAsync(user.Id, info.Login); 
    if (result.Succeeded){ 
     await SignInAsync(user, isPersistent: false); 
     return RedirectToLocal(returnUrl); 
     } 
    } 
    AddErrors(result); 
} 

ViewBag.ReturnUrl = returnUrl; 
return View(model); 
} 

有一些優勢,我沒有看到這樣的await異步模式? 等待運營商使這些阻止調用,這使得他們基本上老式的同步調用。

回答

我還不能回答我的問題,由於缺乏聲譽,但我找到了答案here,而我沒有發佈之前搜索,我錯過了。這些調用是阻塞的,我錯過了,而且在文檔中根本不清楚,ASP.NET是在阻塞期間將當前工作線程返回到ASP.NET線程池。

進一步閱讀 TAP(基於任務的異步模式)是.NET Framework中異步的新模式。 Here鏈接到更多的模式信息比大多數人想要消化。

+6

「等待操作員進行這些阻止呼叫」。這是導致你誤解的虛假陳述。 –

+1

請詳細說明。在代碼繼續之前,使用上面的await操作符調用的方法必須完整,我會調用該阻塞。 – Mikee

+0

我找到答案[這裏](http://stackoverflow.com/questions/19087513/what-is-the-advantage-of-using-async-with-mvc5),呼叫確實阻止。從MSDN幫助中不清楚的是,在阻止期間,當前的ASP.NET工作線程被釋放到池中,並且當異步調用完成時,重新獲取新的ASP.NET工作線程以繼續。 – Mikee

回答

6

調用async方法不會阻塞任何東西。但是,代碼看起來像是同步的。 async方法返回表示異步操作的任務。任務在操作結束時結束。

await是做什麼的,它基本上是將所有代碼註冊爲後續代碼。它將在操作結束時運行。它不會被阻塞,它會在需要運行時被調用。那裏有很大的不同。

例如,當我調用Web服務並打印結果時。當然,我無法打印我沒有的東西,但是不是打電話給服務,而是等待結果,我打電話給服務並告訴它如何處理結果(打印)。

+0

.....我使用術語阻塞可能是一個不好的選擇,因爲沒有線程被阻塞。如果我現在理解正確,await操作符的效果是不允許執行前面的語句,直到'await'方法完成。 – Mikee

+1

@Mikee重要的是要明白,控制傳回給調用者(即ExternalLoginConfirmation的調用者繼續在線程上執行並且未被阻止)。 –

+0

@Mikee這是真的,但在等待之後的代碼被描述爲一個延續。這讓我們更清楚地瞭解這一切的不同步。 – i3arnon

-2

在上述代碼中使用await的好處是,ASP.NET工作線程在'await'操作期間返回到池中,因此可以提供更多的可伸縮性。

Document來自Microsoft關於TAP(基於任務的異步模式)的詳細信息。它用於表示任意的異步操作,並且每個文檔都將廢棄先前.NET框架的異步編程模型(APM)和基於事件的異步模式(EAP)模式。