c# - 异步/等待死锁

标签 c# asp.net-mvc async-await synchronizationcontext

假设我正在编写一个自定义 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/

相关文章:

javascript - 如何在异步方法中使用await内部await并在最后返回结果?

node.js - 当单个 promise 解决或拒绝时,如何让我的程序继续运行?

c# - .NET 4.0 中开箱即用的代码约定

c# - 我将使用什么代码将类似 SQL 的表达式动态转换为正则表达式?

c# - 是否应该让 IDisposable.Dispose() 安全地多次调用?

asp.net-mvc - 如何定义希望未经授权的用户重定向到的登录页面

c# - Xamarin Android - Task.Run 与 Task.Factory.StartNew 和 Thread.CurrentPrincipal

c# - 什么时候在 C# 中拥有公共(public)无参数构造函数很重要?

c# - "Unwrapping"发布 JSON

asp.net-mvc - 未找到 View 'Home' 或其主视图,或者没有 View 引擎支持搜索的位置。搜索了以下位置 : 'sporadic error'