假设我正在编写一个自定义 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
不会?我看不出两者之间的根本区别。返回行为仅在异步任务完成后发生,这就像在返回结果之前将结果放入“匿名返回”局部变量中,所以我不明白为什么前者会死锁。
最佳答案
Why does OnActionExecuting deadlock, whereas OnActionExecuted does not?
我很惊讶它能起作用。您遇到死锁的原因是您在 Task
上调用了 .Result
。这是邪恶的,您应该只在控制台应用程序中调用 .Result
和 .Wait
。
关于c# - 异步/等待死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38446331/