2016-11-07 140 views
-2

在ASP.NET MVC和Web API,異步操作是標有改性劑async,例如控制器的操作方法:什麼等待異步操作方法的返回?

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 

這標誌着動作方法,異步,的「一個因此我的化名異步操作「,並且它表示該方法可能包含'等待被調用到其他方法,並且它不會從上到下執行完整的代碼行。這也表明,它的呼叫者使用類似:

ActionResult result = await Login(LoginViewModel model, string returnUrl) 

意味着該呼叫等待通過Login分拆之前完成正確返回ActionRsult任何一點(或塊狀)異步任務。我們說,呼叫者正在等待撥打Login。我的問題是什麼對象在第二個代碼塊中調用這個函數,然後'等待異步操作'>我從來沒有真正關心過什麼叫做動作,並等待着,之前的一種方法;我一直認爲它與請求 - 響應流水線非常接近,並且在異步操作上忽略了結果過濾器,它幾乎直接進入瀏覽器。

這個等待動作方法的對象是否可以調用更多的對象並阻止管道中的積壓,或者僅僅是async以便我們可以等待其中的其他任務?

+2

我不知道你在問什麼。也許一個代碼示例會有所幫助。 – mason

+1

框架管道等待操作。最終目的是發佈否則等待其他事情(I/O,數據庫等)的資源,以便Web服務器可以處理更多的請求,而其他當前請求很忙。 – David

+0

@mason不要標籤表明你應該知道我在說什麼。我對藥物一無所知,但當我不瞭解論壇上的中間問題時,我不會抱怨。 – ProfK

回答

0

對於異步操作,忽略結果過濾器,它幾乎直接瀏覽器。

否;異步操作就像同步操作一樣進行處理,並處於相同的抽象級別。他們不會跳過任何過濾器。

同步方法和異步方法之間的區別在於同步方法在返回給調用者時完成;異步方法返回完成該方法後完成的任務。有關更多信息,請參閱我的async intro帖子。

這個等待動作方法的對象是否可以調用更多的對象並防止管道中的積壓,或者是否只是異步,以便我們可以等待其中的其他任務?

兩者。 async關鍵字對於使用關鍵字await是必要的,因此從動作的角度來看,需要async來等待其他任務。

從框架的角度來看,它理解當一個動作返回一個任務時,它不一定完成。相反,該動作將在返回的任務完成時完成。該框架將回調函數掛接到該任務,該任務將在該任務完成時發送響應。