C# WPF调度程序引发TargetException异常
我的调试器有一个问题,当在UI线程中执行错误代码时,调试器会正确地指出错误行,在线程中执行时也是如此,但在调度程序中调用时,它的行为有点奇怪:在反汇编中抛出TargetInvocationException 我怎样才能让它正确显示并避免这个恼人的消息 下面是一个简单的示例,说明了问题:C# WPF调度程序引发TargetException异常,c#,wpf,multithreading,dispatcher,targetinvocationexception,C#,Wpf,Multithreading,Dispatcher,Targetinvocationexception,我的调试器有一个问题,当在UI线程中执行错误代码时,调试器会正确地指出错误行,在线程中执行时也是如此,但在调度程序中调用时,它的行为有点奇怪:在反汇编中抛出TargetInvocationException 我怎样才能让它正确显示并避免这个恼人的消息 下面是一个简单的示例,说明了问题: private void Button_Click_1(object sender, RoutedEventArgs e) { //navigator.NavigatToMenuAccue
private void Button_Click_1(object sender, RoutedEventArgs e)
{
//navigator.NavigatToMenuAccueil(true);
//Throws NullPointerException
/*String x = null;
String y = x.ToUpper();*/
Thread th = new Thread(DoWork);
th.Start();
}
private void DoWork()
{
//Throws NullPointerException
/*String x = null;
String y = x.ToUpper();*/
Thread.Sleep(1000);
Dispatcher.BeginInvoke(new Action(() =>
{
//Throws TargetInnvocationException
/*
String x = null;
String y = x.ToUpper();
*/
MyTextBlock.Text = "My New Text";
}));
}
TargetInvocationException
是由反射()调用的方法引发的异常,通过使用BeginInvoke
,您告诉调度程序执行此操作
在传递的委托内引发的任何异常都将包装在TargetInvocationException
中。您不能阻止调度器包装原始的exeption。您仍然可以通过访问InnerException
获取原始异常 谢谢你的解释,有解决办法吗?从线程修改UI元素并使调试器仍能正常工作的另一种方法?@jeN调试器仍能正常工作,您只需在TargetInvocationException上展开InnerException属性。如果捕获到异常,可以使用InnerException执行任何操作,这正是您所追求的。但是重新调用InnerException会删除其StackTrace,这可能不是您想要的。我所说的“dubugger无法正常工作”是指我在调用堆栈中看不到原始异常,我看不到变量的值,异常被targetinvocationexception吸收。如果我使用AsyncTask Istead,我会遇到这种问题吗?@jeN使用VS2012,您的示例中出现了正确的异常。也许你的VS版本处理它的方式不同?但是,您可以尝试在Lambda中捕获异常,然后在那里设置断点。