ASP.NET MVC 4 非同步子操作
我有一個面向 .NET 4.5 的 ASP.NET MVC 4 應用程序。我們的子操作之一使用 HttpClient 呼叫 Web 服務。
由於我們阻塞了等待 HttpClient 響應的 IO,因此將程式碼轉換為 async/await 模式非常有意義。但是,當 MVC 4 嘗試執行子操作時,我們會收到以下錯誤消息:
HttpServerUtility.Execute 在等待非同步操作完成時被阻塞。
乍一看,MVC 4 似乎不支持子操作中的非同步/等待。剩下的唯一選擇是使用同步程式碼執行並在非同步任務上強制“等待”。
眾所周知,在 ASP.NET 上下文中的非同步任務上觸摸 .Result 或 .Wait() 將導致立即死鎖。我的非同步邏輯包含在類庫中,所以我不能使用“await blah.ConfigureAwait(false)”技巧。請記住,在子操作上標記“非同步”並使用等待會導致錯誤,這會阻止我配置等待。
在這一點上,我被畫到了一個角落。有沒有辦法在 MVC 4 子操作中使用非同步方法?似乎是一個沒有解決方法的完全錯誤。
MVC 的某些部分仍然
async不友好;我希望這些將在未來得到解決。請為此創建 Connect 或 UserVoice 問題。我的非同步邏輯包含在類庫中,所以我不能使用“await blah.ConfigureAwait(false)”技巧。
您可能應該添加
ConfigureAwait(false)到您的類庫中的呼叫(如果可以的話)。你也可以破解一個替代解決方案。如果您的類庫方法不需要 ASP.NET 上下文,那麼您可以讓執行緒池執行緒執行 (a) 等待您:
try { var result = Task.Run(async () => { await MyHttpRequest(...); }).Result; } catch (AggregateException ex) { ... }效果類似於
ConfigureAwait(false): 因為MyHttpRequest線上程池上下文中執行,所以它在完成時不會嘗試進入 ASP.NET 上下文。