2012-01-09 29 views
2

嗨我打電話給Web服務的一些項目,當他們回來時,我創建了一個界面,適合在一個單獨的方法返回的項目。現在,每當出現問題時,我都需要捕捉異常並向用戶顯示消息。調用try方法時不捕獲異常?

private void itemHelper_FeaturedItemsCalled(object sender, List<MyItem> _myItemList) 
{ 
    try 
    { 
     Dispatcher.BeginInvoke(() => 
     { 
      if(_myItemList != 0) 
       CreateInterface(_myItemList); 
     }); 
    } 
    catch 
    { 
     Dispatcher.BeginInvoke(() => 
     { 
      LoadingScreen.Visibility = System.Windows.Visibility.Visible; 
      LoadingTextBlock.Text = "Unable to display items."; 
      BusyIndicator1.IsRunning = false; 
     } 
    } 
} 

現在我特意方法CreateInterface()內拋出異常。現在,當這個運行我得到和未處理的異常。這是爲什麼?我以爲這個方法在嘗試中被調用,它最終會在這裏被處理?

+2

一個不同的線程用於運行'BeginInvoke'調用的委託,所以異常在那裏引發並且未處理。 – 2012-01-09 14:49:31

回答

4

嘗試把嘗試捕捉的BeginInvoke的內部。發生什麼事是你在不同的線程上執行這段代碼,所以異常不會被不同的線程捕獲。

+0

+1簡單的解決方案。 – loyalpenguin 2012-01-09 15:06:57

7

通過調用BeginInvoke即表示您在「在調度程序線程中執行此代碼」。 BeginInvoke是異步的,所以整個方法可能會在代碼執行之前完成 - 那麼它怎麼可能進入catch塊呢?到那時調用線程可能會處於完全不同的代碼段。

這是可能,如果你使用Invoke而不是BeginInvoke可能得到整理返回給調用者除外 - 但它是我看不到任何證據的文檔。

編輯:此外,即使你已經設法捕獲異常,你會訪問來自錯誤的線程的UI在這一點......

+0

感謝您的回答。我有一個想法,BeginInvoke是問題,但現在我知道爲什麼。如果我在BeginInvoke中調用try/catch,它會捕獲異常。 – loyalpenguin 2012-01-09 14:55:02

+0

@loyalpenguin:請參閱我的編輯,瞭解一個重要的附加點 - 您在catch塊中的代碼需要另一個Invoke/BeginInvoke調用。 – 2012-01-09 15:15:16

+0

是非常好的一點。對不起,我忙於嘗試替換刪除第二個BeginInvoke的原始值。我會解決它。我想通過將所有內容放在一個BeginInvoke中,我可以刪除該問題。我只是希望通過運行BeginInvoke裏面的所有東西來避免資源癱瘓...... – loyalpenguin 2012-01-09 15:20:19