Подтвердить что ты не робот

Обнаружение необработанных исключений в дочерних потоках в WPF

У меня есть приложение WPF, которое объединяет несколько потоков. Я определил обработчик события DispatcherUnhandledException в App.xaml.cs, который отображает подробное сообщение об ошибке, и этот обработчик вызывается каждый раз, когда поток пользовательского интерфейса встречает исключение. Проблема связана с дочерними потоками: их необработанные исключения никогда не обрабатываются. Как это сделать?

Пример кода:

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
    //...
}

Изменить: Как только произойдет необработанное исключение, я хочу отобразить сообщение об ошибке со стеком, а затем выйти из приложения.

4b9b3361

Ответ 2

Это по дизайну, вы должны использовать try/catch на верхнем уровне DoWork. Некоторые модели резьбы удовлетворяют этому, посмотрите пример фонаря.

Класс .NET 4 Task обеспечивает хороший интерфейс для этой проблемы. До тех пор вам придется позаботиться об этом самостоятельно или использовать модели BGW или IAsyncResult.