在WPF中捕获子线程中未处理的异常

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (27)

有一个WPF应用程序可以关闭几个线程。 我在App.xaml.cs中定义了一个DispatcherUnhandledException事件处理程序,它显示详细的错误消息,并且每次UI线程遇到异常时都会调用此处理程序。 问题在于子线程:它们未处理的异常从未得到处理。 我该怎么做呢?

样本代码:

private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
    MessageBox.Show("detailed error message");
}

private void Application_Startup(object sender, StartupEventArgs e)
{
    //...
    //If an Exception is thrown here, it is handled
    //...

    Thread[] threads = new Thread[numThreads];
    for(int i = 0; i < numThreads; i++)
    {
        threads[i] = new Thread(doWork);
        threads[i].Start();
    }
}

private void doWork()
{
    //...
    //Exception thrown here and is NOT handled
    //...
}
提问于
用户回答回答于
用户回答回答于

这是设计上的,应该在DoWork的顶层使用TRY/CATCH。一些线程模型满足这一点,看看背景工人的一个例子。

NET4Task类为此问题提供了一个很好的接口。在此之前,必须自己处理,或者使用BGW或IAsyncResult模型。

扫码关注云+社区