2010-03-29 30 views
6

問題:重新使用.NET Backgroundworker,是否沒有辦法讓異常通常返回主線程?.NET Backgroundworker - 有沒有辦法讓異常通常返回到主線程?

背景:

在我的WinForms應用程序
  • 目前我有通用的異常句柄線沿線的推移,如果(一個),那麼自定義應用程序的例外呈現給用戶,但不退出程序, (b)如其他異常再出現,然後退出應用程序
  • 以上是很好的,因爲我可以只是把適當的異常在應用和演示隨時隨地/處理是一般處理

回答

6

BackgroundWorker自動返回異常。當您鉤住RunWorkerCompleted事件時,它在AsyncCompletedEventArgs.Error屬性中。

如果你喜歡,你可以在這個事件處理程序中包裝和重新拋出異常 - 請記住,框架中有一個bug會導致「外部」異常,而不是因爲你處於一個Invoke

在.NET應用程序的後臺線程中發生的異常是一個災難性的錯誤,它會導致整個過程;解決此問題的唯一方法是將所有活動都包含在try-catch塊中,並保存發生的任何異常,這正是BackgroundWorker所做的。

+0

@Aaronaught - 你的意思是「這將導致」內部「異常被拋出」? (感謝您的回覆) – Greg 2010-03-29 00:40:01

+0

知道了!我剛剛在backgroundWorker1_RunWorkerCompleted內部創建了一個新的BusinessException,並將innerException設置爲「null」。 – Greg 2010-03-29 00:49:27

1

沒有,有ISN」噸。

相反,你可以繼承BackgroundWorker和覆蓋OnRunWorkerCompleted檢查e.Error和運行異常處理程序,如果它不是null類。

+0

感謝您的想法 – Greg 2010-03-29 00:40:26

2

如果由DoWork調用的異步方法引發異常,該異常將對RunWorkerCompleted處理程序可用。你可以在那裏處理它。

private void backgroundWorker1_RunWorkerCompleted(
    object sender, RunWorkerCompletedEventArgs e) 
{ 
    // First, handle the case where an exception was thrown. 
    if (e.Error != null) 
    { 
     MessageBox.Show(e.Error.Message); 
    } 
    ... 
} 

MSDN

如果 異步操作過程中拋出一個異常,班會 例外分配給錯誤 財產。在訪問 之前,客戶端應用程序的 事件處理程序委託應檢查 Error屬性從 派生的類中的任何屬性AsyncCompletedEventArgs;否則, 該屬性將引發 TargetInvocationException,其 InnerException屬性持有對Error的引用 。

相關問題