本文參考自: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); } });