假设我正在编写一个自定义 MVC 过滤器,它在方法重写中执行一些异步调用,如下所示:
public class MyActionFilter : System.Web.Mvc.ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext ctx)
{
var stuff = ConfigureAwaitHelper1().Result;
// do stuff
}
public override void OnActionExecuting(ActionExecutingContext ctx)
{
var stuff = ConfigureAwaitHelper2().Result;
// do stuff
}
private async Task<string> ConfigureAwaitHelper1()
{
var result = await client.GetAsStringAsync("blah.com").ConfigureAwait(false);
return result;
}
private async Task<string> ConfigureAwaitHelper2()
{
return await client.GetAsStringAsync("blah.com").ConfigureAwait(false);
}
}
为什么OnActionExecuting
僵局,而OnActionExecuted
才不是?我看不出两者之间有什么根本区别。返回的行为仅在异步任务完成后发生,这就像在返回之前将结果放入“匿名返回”本地变量中,所以我不明白为什么前者会死锁。
为什么 OnActionExecuting 会死锁,而 OnActionExecuted 不会?
我很惊讶它竟然有效。您遇到僵局的原因是您正在调用.Result
on a Task
。这是邪恶的,你应该只调用.Result
and .Wait
在控制台应用程序中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)