Asp.net
在不使用 await 的情況下呼叫非同步方法時防止死鎖
我需要呼叫一個
Task從內部返回 a 的方法public override void OnActionExecuting(ActionExecutingContext filterContext)它不會讓我使這個方法非同步它拋出以下
非同步模組或處理程序已完成,而非同步操作仍處於掛起狀態。
和打電話的時候
entityStorage.GetCurrentUser().Result我陷入僵局。我怎樣才能避免這種情況?
我一直在玩弄它想出類似的東西
entityStorage.GetCurrentUser().Result.ConfigureAwait(false).GetAwaiter().GetResult();但這行不通。我該怎麼做?我的解決方案需要使用 ASP.NET 4 和 Async Targetting Pack,我不能像部署到 Azure 一樣使用 ASP.NET 4.5。
由於 await 只是編譯器為您重寫延續的語法糖,因此最“直接”的路徑是採用將遵循您的 await 的任何程式碼並將其設為 ContinueWith 呼叫。
所以,像:
entityStorage.GetCurrentUser().ContinueWith(t => { // do your other stuff here });
這裡解釋了死鎖的原因。簡而言之,不要阻塞
async程式碼。您應該ConfigureAwait(false)在您的庫async程式碼和await結果中使用(不使用ResultorWait)。**更新:**請在此處為 MVC 團隊投票以添加對
async操作過濾器的支持。