Рассмотрим следующие два приложения:Почему Dispatcher.BeginInvoke распаковывает TargetInvocationException для ThreadStart, но не для Action?
1:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Dispatcher.UnhandledException += Dispatcher_UnhandledException;
}
void Dispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
System.Diagnostics.Debug.WriteLine(e.Exception.GetType());
}
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Dispatcher.BeginInvoke((ThreadStart)delegate
{
throw new AccessViolationException("test");
}, DispatcherPriority.Input);
}
}
2:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Dispatcher.UnhandledException += Dispatcher_UnhandledException;
}
void Dispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
System.Diagnostics.Debug.WriteLine(e.Exception.GetType());
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Dispatcher.BeginInvoke((Action)delegate
{
throw new AccessViolationException("test");
}, DispatcherPriority.Input);
}
}
Оба приложения являются идентичными для использования двух различных типов делегата, Action
и ThreadStart
, за исключением (которые имеют тот же подпись).
Результаты (окно вывода, при вызове обработчика события с помощью кнопки мыши)
1: System.Reflection.TargetInvocationException
2: System.AccessViolationException
Почему приложения отличаются поведение?
Полный стек для исключения # 1:
System.Reflection.TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht. ---> System.AccessViolationException: test
bei ExceptionTest.MainWindow.<Button_Click>b__0() in c:\Users\fschmitz\Documents\Visual Studio 11\Projects\ExceptionTest\MainWindow.xaml.cs:Zeile 40.
--- Ende der internen Ausnahmestapelüberwachung ---
bei System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
bei System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
bei System.Delegate.DynamicInvokeImpl(Object[] args)
bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
bei MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
так действительно ваш вопрос: «Почему« Displatcher.BeginInvoke (Action) «throw» и «AccessViolationException»? » – DLeh
@ DLeh: Я думаю, что более подходящая формулировка «почему« Dispatcher.BeginInvoke »позаботится о том, чтобы развернуть« TargetInvocationException »для« Action », но не для« ThreadStart »? –
@JeroenMostert Да, это тоже будет подходящим предметом. – floele