【发布时间】:2017-01-18 20:52:46
【问题描述】:
我们有一个相当大的 WPF Prism 应用程序,它大量使用异步等待模式。
我还实现了一个全局异常处理程序,它显示一个 MessageBox 并优雅地关闭应用程序,使用如下所有事件。
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
DispatcherUnhandledException += App_DispatcherUnhandledException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
当我一次遇到一个异常时,它工作得非常好,并且让开发人员在遇到某些同步逻辑错误时立即知道。但是我们遇到了一个问题,其中 3 个未处理的异常来自单独的异步 void 事件处理程序。
2 个未处理的事件意味着 MessageBox.Show 实际上会通过抛出一个完全不相关的先前异常而失败,就好像 UI 线程已经放弃并刚刚从队列中拉出最后一个异常。 DispatcherUnhandledException 只会触发一次。
然后第三个异常将转到 Current.Domain.UnhandledException 并导致未处理的崩溃,因为那时我已经尝试关闭应用程序。
所以我想我的问题是以前有人见过这种行为吗?您能否指出任何资源来更好地解释 Dispatcher 如何处理多个异常?理想情况下,我只想抓住第一个并将其余的扔掉,但第二个异常会阻止我的 MessageBox 完全打开。
现在有没有办法忽略 Domain.UnhandledException,因为应用程序在技术上应该已经关闭?
【问题讨论】:
标签: c# wpf multithreading exception-handling async-await