2013-03-14 37 views
2

我的调试器出现问题,当在UI中执行错误的代码时线程调试器正确指出错误行,当它在线程内执行时也是如此,但调用器在调用时表现得有点奇怪在调度程序中:在反汇编中引发TargetInvocationException。WPF Dispatcher抛出TargetInvocationException

我怎样才能正确显示它,并避免这个烦人的消息?

下面是一个简单的例子,说明了这个问题:,利用BeginInvoke

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"; 
     }));    

    } 

回答

1

TargetInvocationException是由反射(according to MSDN)调用的方法抛出的异常,你是在告诉Dispatcher做。

在传递的委托中引发的任何异常都包含在TargetInvocationException中。您无法阻止Dispatcher包装原始的豁免。尽管如此,您仍然可以通过访问InnerException获得最初的例外。

+0

感谢您的解释,是否有解决方法?另一种从线程修改UI元素并仍然能够正常工作的方法? – jeN 2013-03-14 14:05:47

+0

@jeN调试器仍然正常工作,您只需展开TargetInvocationException上的InnerException属性即可。如果你发现异常,你可以用InnerException来做任何你想做的事情,这就是你所追求的。但重新抛出InnerException会抹掉它的StackTrace,这可能不是你想要的。 – Botz3000 2013-03-14 14:13:32

+0

我的意思是“dubugger工作不正常”,是因为我看不到调用堆栈中的原始异常,我看不到变量的值,异常被targetinvocationexception吸收。如果我使用AsyncTask Istead,会遇到这种问题吗? – jeN 2013-03-14 14:29:30

相关问题