我需要调用返回的方法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。
由于的await只是编译器重写延续你的语法糖,最“直接”路径将采取一切代码是要遵循你的await,并使其成为ContinueWith电话。
所以,这样的:
entityStorage.GetCurrentUser().ContinueWith(t =>
{
// do your other stuff here
});
僵局的原因是这里解释 。 总之,不要阻止async
代码。 您应该使用ConfigureAwait(false)
库中的async
代码,并await
结果(不使用Result
或Wait
)。
更新:请投票在这里的MVC团队添加支持async
操作筛选。
如果你必须转换非同步进行同步。
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;
}
否则,使用@斯蒂芬的回答。