C# WPF调度程序引发TargetException异常

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

我的调试器有一个问题,当在UI线程中执行错误代码时,调试器会正确地指出错误行,在线程中执行时也是如此,但在调度程序中调用时,它的行为有点奇怪:在反汇编中抛出TargetInvocationException

我怎样才能让它正确显示并避免这个恼人的消息

下面是一个简单的示例,说明了问题:

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中捕获异常,然后在那里设置断点。