Перехват необработанных исключений в дочерних потоках в WPF
-
07-07-2019 - |
Вопрос
У меня есть приложение 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.