Asp.net

在不使用 await 的情況下呼叫非同步方法時防止死鎖

  • June 27, 2016

我需要呼叫一個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 一樣使用 A​​SP.NET 4.5。

由於 await 只是編譯器為您重寫延續的語法糖,因此最“直接”的路徑是採用將遵循您的 await 的任何程式碼並將其設為 ContinueWith 呼叫。

所以,像:

entityStorage.GetCurrentUser().ContinueWith(t =>
{
   // do your other stuff here
});

這裡解釋了死鎖的原因。簡而言之,不要阻塞async程式碼。您應該ConfigureAwait(false)在您的庫async程式碼和await結果中使用(不使用Resultor Wait)。

**更新:**請在此處為 MVC 團隊投票以添加對async操作過濾器的支持。

引用自:https://stackoverflow.com/questions/11887915