【问题标题】:MessageBox fails with multiple unhandled async exceptionsMessageBox 因多个未处理的异步异常而失败
【发布时间】: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


    【解决方案1】:

    AppDomain.CurrentDomain.UnhandledException 和 TaskScheduler.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);
        }
    } 
    

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 2020-05-09
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      相关资源
      最近更新 更多