为什么调试时这个异步控制器操作会挂起?

时间:2015-02-15 20:27:26

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

自从我开始使用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);

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

有没有办法调试这个?有趣的是,这仅在调试期间发生,在生产中,异常将按预期提升。

重新问/澄清/非重复 这最初是asked here,但它已关闭为duplicate of this question,但事实并非如此。添加了澄清说明为什么不是。但是因为他们关闭了一个明确的重复,你甚至看不到它,所以我不得不问一个新的问题。

1 个答案:

答案 0 :(得分:0)

它与Microsoft / Azure的Application Insights有关。我需要再研究一下(因为我刚刚删除了所有的AI引用,我需要重新安装才能进行调查),但它可能是一个未经过同步的异步调用我正在制作AI或AI内部的一个bug(它是预先的-发布)。我只是手动调用AI三次,我没有收到任何关于异步调用没有等待的警告,所以我不认为是这种情况,可能是AI内部或设计中的错误。

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