У меня есть случай, когда исключение, созданное в потоке пользовательского интерфейса, не попадает в вызывающий поток.SynchronizationContext и DispatcherUnhandledException
using System;
using System.Diagnostics;
using System.Threading;
using System.Windows;
namespace SynchronisationContextAndExceptionWPF
{
public partial class MainWindow : Window
{
private readonly SynchronizationContext _synchronizationContext;
public MainWindow()
{
InitializeComponent();
_synchronizationContext = SynchronizationContext.Current;
}
private void Button_OnClick(object sender, RoutedEventArgs e)
{
try
{
_synchronizationContext.Send(
x =>
{
try
{
DoSomethingOnUiThreadThatThrowsException();
}
catch (Exception)
{
Debug.WriteLine("Catched Exception in thread that threw it.");
throw;
}
}, null);
}
catch (Exception)
{
Debug.WriteLine("Catched Exception in thread that calles Send-Method.");
throw;
}
}
private static void DoSomethingOnUiThreadThatThrowsException()
{
throw new Exception("Any Exception...");
}
}
}
Сначала я подумал, что не может возможно (вся документация я нашел, сказал, что я могу поймать исключения там). После некоторого повторного поиска я обнаружил проблему: в моем приложении используется UnhandledExceptionHandler. Это обрабатывает DispatcherUnhandledException
-Event. Я показываю некоторую информацию для пользователя и установить e.Handled = true;
:
using System.Diagnostics;
using System.Windows;
using System.Windows.Threading;
namespace SynchronisationContextAndExceptionWPF
{
public partial class App : Application
{
public App()
{
DispatcherUnhandledException += App_DispatcherUnhandledException;
}
private static void App_DispatcherUnhandledException(
object sender,
DispatcherUnhandledExceptionEventArgs e)
{
Debug.WriteLine("Catched Exception in UnhandledExceptionHandler.");
// This line makes the difference:
e.Handled = true;
}
}
}
Итак, вопрос: почему же DispatcherUnhandledException
-Event поднял, даже если я с этим справиться? Как бы вы решили эту ситуацию?
Это работает для меня! Возможно, это не общее решение для всех, но делает меня счастливым прямо сейчас. Благодаря! – joerg