Вопрос умозрительный, скорее для понимания работы с исключениями и потоками. Понятно, что на практике обработчики должны быть асинхронными, тогда все исключения можно будет поймать через обработку события App.Current.DispatcherUnhandledException.
Итак, есть обработчик нажатия на кнопку в WPF-приложении:
private void TaskRunButton_Click(object sender, RoutedEventArgs e)
{
Task.Run(() => { throw new Exception("This Exception occured in the MainWindow Task.Run() handler"); });
}
Ожидаю, что исключение будет обработано здесь:
void Dispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
MessageBox.Show(e.Exception.Message, "Dispatcher_UnhandledException", MessageBoxButton.OK, MessageBoxImage.Error);
}
Потому что в корне приложения есть подписка:
[STAThread]
public static void Main()
{
TaskScheduler.UnobservedTaskException += TaskSheduler_UnobservedTaskException;
var vm = new MainVM();
var window = new MainWindow() { DataContext = vm };
var app = new App();
app.Run(window);
}
Почему этого не происходит и как все-таки поймать такое исключение?