异步/等待死锁

2023-12-07

假设我正在编写一个自定义 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(使用前将#替换为@)

异步/等待死锁 的相关文章

随机推荐