targetinvocationexception錯誤處理


本文參考自:http://stackoverflow.com/questions/9586006/application-current-dispatcher-begininvoke-where-to-place-try-catch

我在項目中,寫了一個http異步請求,然后在callback中寫了,Dispatcher.BeginInvoke(()={//前台展示});

因為異步可能沒執行完,然后就直接引用了,然后報錯,錯誤:“System.Reflection.TargetInvocationException”類型的未經處理的異常在 System.Windows.ni.dll 中發生。這種情況一般是因為begininvoke 造成的,begininvoke往系統編譯好的clr進行Reflection(概念不是很懂,字面意思是反射,就是從系統的“運行時”調用)的時候報的錯,不能像一般的程序方法一樣的外包 try catch ,必須在里面try catch

想抓住異常,參考了stackoverflow中介紹的方法,據介紹:“BeginInvoke will Execute your Method in anoster Stack. So a try-catch around "Application.Current.Dispatcher.BeginInvoke" will not work.”就是說,begininvoke執行的方法在別的堆棧里,所以外面的trycatch不工作。

方法一(錯誤):

                try
                {
                    Dispatcher.BeginInvoke(() =>
                    {
                       //賦值給前台控件,這種方法抓不住異常
                    });
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }        

方法二(正確):

            Dispatcher.BeginInvoke(() =>
                {
                    try
                    {
                        //賦值給前台控件,這種方法可以抓住異常
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                });

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM