【发布时间】: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