【问题标题】:Why does this async controller action hang while debugging?为什么调试时这个异步控制器操作会挂起?
【发布时间】:2015-02-17 11:12:40
【问题描述】:

自从我从一开始就开始使用 ASYNC 处理 MVC 项目 - 所有控制器、数据库调用等都是异步的,等待着我一直在调试地狱。我从来没有得到有用的调试/异常信息——它在系统的内部丢失了。我必须进入 ELMAH 或 AI 才能查看异常,因为它永远不会冒泡并结束请求。

在大多数情况下,页面会旋转,直到浏览器放弃。我在某处遗漏了什么吗?例如,我在页面上有一个错误(空引用),但由于页面是异步的,所以我从来没有看到异常。

与这里提出的大多数会导致死锁的问题不同,在此代码库中的任何地方都没有使用 .Result。从一开始到一直都是异步的。

为了澄清,这里是这个 MVC 控制器的确切工作流程。我做了一些更改来测试它什么时候挂起,什么时候不挂起。

控制器

public async Task<ActionResult> Review(Guid id)
{
    var quote = await Quotes.GetQuoteById(id);
    return View();
}

服务

return await Ef.DbSet.Where(d => d.Id == id).FirstOrDefaultAsync();

查看(第一行)

@{ throw new ApplicationException("you failed"); }

通过上述设置,我将永远不会看到异常。它只是挂起。但是,如果我将控制器更改为:

return View();
var quote = await Quotes.GetQuoteById(id);

然后我得到了我的例外。如果我将服务更改为非异步,我也会遇到异常。因此,与引用的重复问题不同,我在任何地方都没有 unwaited 电话。但是 async/await 是导致浏览器挂起的原因。

有没有办法调试这个?顺便说一句,这仅在调试期间发生,在生产中,异常将按预期引发。

重新询问/澄清/不重复 这最初是asked here,但它被关闭为duplicate of this question,但它不是。添加了说明以说明为什么不是。但由于它们作为明确的重复而关闭,你甚至看不到它,所以我不得不提出一个新问题。

【问题讨论】:

  • 不要double post请删除你的两个问题之一。
  • 您是否尝试删除异步/创建一个不同的非 Task 操作来做同样的事情?这将消除 Quotes.GetQuoteById 的任何问题,只会给您留下可能的死锁问题
  • @MarkPM 如果我删除 async/Task 那么它会按预期工作。导致挂起的是异步。但是哪里会出现死锁问题呢?上面的代码就是一切。我什至用一个动作创建了一个单独的控制器,以确保没有任何东西潜入。带有异步控制器的视图中的异常导致页面永远不会完全加载。不允许控制器
  • @ScottChamberlain 我现在删除了另一个。但只发布了两次,因为它已关闭并作为副本重定向 - 根据最后的说明。本来希望使用原始问题。
  • @StephenCleary 我想通了。谢谢你 :) 我无法在新的解决方案中回购,而我不太熟悉的一件事是问题 - Application Insights (MS Azure)。我的报告代码中可能没有等待异步方法(只有三个地方,所以我对此表示怀疑)或代码中的错误。我会调查一下,看看我能不能弄清楚那部分。

标签: c# .net asp.net-mvc asynchronous async-await


【解决方案1】:

它与 Microsoft/Azure 的 Application Insights 相关。我必须进一步研究它(因为我刚刚删除了所有 AI 引用并且我需要重新安装以进行调查),但这可能是我正在对 AI 进行的一个未等待的异步调用或 AI 内部的错误(它是 pre -发布)。我只手动对 AI 进行了 3 次调用,并且没有收到任何关于未等待异步调用的警告,因此我认为情况并非如此,可能是 AI 内部的错误或设计使然。

卸载 AI 让异常像往常一样流动。

【讨论】:

    猜你喜欢
    • 2019-10-21
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多