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

StackOverflow https://stackoverflow.com/questions/1428692

Вопрос

У меня есть приложение 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
    //...
}

Правка . После возникновения необработанного исключения я хочу отобразить сообщение об ошибке с трассировкой стека и выйти из приложения.

Это было полезно?

Решение

Попробуйте подключиться к AppDomain.CurrentDomain.UnhandledException событие.

Другие советы

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

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

scroll top