MessageBox因多个未处理的异步异常而失败

时间:2017-01-17 21:40:17

标签: c# wpf multithreading exception-handling async-await

我们有一个相当大的WPF Prism应用程序,它大量使用async-await模式。

我还实现了一个全局异常处理程序,它显示了一个MessageBox,并使用如下所有事件正常关闭应用程序。

if let c = blah.down["foo"]?.count, c > 0 {
   print("some foos exist!!")
}
else {
   print("there are profoundly no foos")
}

当我一次得到一个异常时,它可以很好地工作,当开发人员得到一些同步逻辑错误时,让开发人员立即知道。但是我们遇到了一个问题点,其中3个未处理的exeptions来自单独的异步void事件处理程序。

2个未处理的事件意味着MessageBox.Show实际上会通过抛出一个完全不相关的先前异常而失败,就像UI线程已经放弃并且刚刚从队列中拉出最后一个异常一样。 DispatcherUnhandledException只会触发一次。

第三个异常将转到Current.Domain.UnhandledException并导致无法处理的崩溃,因为此时我已经尝试关闭该应用程序。

所以我想我的问题是以前有人见过这种行为吗?您能否指出我的任何资源来更好地解释Dispatcher如何处理多个异常?理想情况下,我只想抓住第一个并抛弃其余部分,但第二个例外会阻止我的MessageBox打开。

此时是否有办法忽略Domain.UnhandledException,因为技术上应用程序已经关闭了?

1 个答案:

答案 0 :(得分:0)

可能会从多个线程引发AppDomain.CurrentDomain.UnhandledExceptionTaskScheduler.UnobservedTaskException事件,因此您希望通过引入同步原语(例如锁)来使这些事件处理程序成为线程安全的:

private readonly object _lock = new object();
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    lock (_lock)
    {
        //one one thread at a time can enter this critical section
        MessageBox.Show("An error occured...");
        Environment.Exit(1);
    }
}