2015-04-06 73 views
0

我有一個MVC4應用程序,並且有幾個實例可以在幾個方法調用中「激發並忘記」它。這些方法運行時間較長,不應阻止迴應用戶。我意識到異步控制器方法在這裏不幫助我,但是在特定的控制器方法中,我想調用一個方法,使用await關鍵字來對付異步函數。將上下文對象傳遞給異步操作

足夠簡單,但對於每個請求,應用程序都會建立一個[ThreadStatic]上下文,該上下文可用於鏈中的任何方法調用。此上下文包含當前用戶等內容。

因此,異步方法也需要此上下文。除了簡單地將它傳遞給方法本身之外,是否有將此上下文傳遞到異步方法的首選模式?這可以做到,但感覺不太對。

+1

你意識到這不僅僅是異步控制器方法,「這裏不幫助你」,對吧?通常,異步/等待會阻止調用方法返回,直到異步任務完成。無論是控制器動作還是某些異步類的方法都無關緊要,您仍然沒有從中獲得「火和遺忘」的功能。 – 2015-04-06 14:42:41

+0

是的。好點,並感謝澄清。我過去爲此使用了System.Threading.Tasks.Task.Factory.StartNew()。我在想異步/等待會是這個的一個捷徑,但正如你所指出的那樣,事實並非如此。 – 2015-04-06 21:58:25

+0

我認爲混淆可能來自腳本語言(如JavaScript)中的異步,它在某種程度上會引發火災並且被遺忘,如果您希望在之後進行其他一些工作,則需要回調。在ASP.NET中,它是關於Web服務器線程的。當異步處於等待狀態時,Async將線程返回給池以處理其他請求,但調用方法仍然必須在返回之前完成任務。 StartNew()並不是一個好主意,特別是在Web服務器環境中。查看實際的後臺或任務計劃解決方案。 – 2015-04-07 12:24:49

回答

2

最好方法是將它傳入方法,或者使用依賴注入庫。但是,如果您確實想傳遞「環境」上下文而不實際將其作爲參數傳遞,則可以使用邏輯調用上下文(CallContext.LogicalGetData/CallContext.LogicalSetData)來存儲不可變數據。我有一個更詳細的寫法on my blog