不使用调用异步方法时的await防止死锁(Preventing a deadlock when ca

2019-06-26 21:53发布

我需要调用返回的方法Task从内

public override void OnActionExecuting(ActionExecutingContext filterContext)

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

异步模块或处理程序而异步操作仍有待完成。

和打电话时

 entityStorage.GetCurrentUser().Result

我得到一个僵局。 我怎样才能避免这种情况?

我一直在玩弄它的到来了这样的东西

entityStorage.GetCurrentUser().Result.ConfigureAwait(false).GetAwaiter().GetResult();

但是,这是行不通的。 我该怎么做? 我的解决方案将需要与ASP.NET 4和异步靶向包工作,因为我部署到Azure中我不能使用ASP.NET 4.5。

Answer 1:

由于的await只是编译器重写延续你的语法糖,最“直接”路径将采取一切代码是要遵循你的await,并使其成为ContinueWith电话。

所以,这样的:

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


Answer 2:

僵局的原因是这里解释 。 总之,不要阻止async代码。 您应该使用ConfigureAwait(false)库中的async代码,并await结果(不使用ResultWait )。

更新:请投票在这里的MVC团队添加支持async操作筛选。



Answer 3:

如果你必须转换非同步进行同步。

public User GetCurrentUserSynch()
    {
        return Task.Run(() =>
        {
            var asyncResult = entityStorage.GetCurrentUser();
            while (!asyncResult.IsCompleted)
            {
                Application.Current.TryFindResource(new object()); // This is for WPF but you can do some other nonsense action of your choosing
            }

            return asyncResult.Result;
        }).Result;
    }

否则,使用@斯蒂芬的回答。



文章来源: Preventing a deadlock when calling an async method without using await