在不使用await的情况下调用异步方法时防止死锁

Tom*_*Tom 13 asp.net asp.net-mvc asp.net-4.0 async-await asp.net-mvc-3

我需要调用一个Task从内部返回a的方法

public override void OnActionExecuting(ActionExecutingContext filterContext)
Run Code Online (Sandbox Code Playgroud)

它不会让我使这个方法异步它抛出以下

在异步操作仍处于挂起状态时完成异步模块或处理程序.

并在打电话时

 entityStorage.GetCurrentUser().Result
Run Code Online (Sandbox Code Playgroud)

我陷入僵局.我怎么能避免这个?

我一直在玩它想出类似的东西

entityStorage.GetCurrentUser().Result.ConfigureAwait(false).GetAwaiter().GetResult();
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我该怎么做?我的解决方案需要使用ASP.NET 4和Async Targetting Pack,我不能使用ASP.NET 4.5作为部署到Azure.

Ste*_*ary 13

这里解释了死锁的原因.简而言之,不要阻止async代码.您应该ConfigureAwait(false)在您的库async代码和await结果中使用(不使用ResultWait).

更新:在这里投票给MVC团队添加对async动作过滤器的支持.


Jam*_*ing 2

由于await只是编译器为您重写延续的语法糖,因此最“直接”的路径是采用await后面的任何代码并将其设为ContinueWith调用。

所以,像这样:

entityStorage.GetCurrentUser().ContinueWith(t =>
{
    // do your other stuff here
});
Run Code Online (Sandbox Code Playgroud)