2013-05-17 53 views
5

我有一個具有BackgroundWorker的WPF應用程序。我在這個BGW中拋出了一個例外,但是它並沒有在任何地方顯示出來,只是後臺工作人員觸發了其事件。爲什麼我的例外在wpf應用程序中沒有任何區別?

去哪裏?

+1

從上'BackgroundWorker' MSDN的條目:「如果操作引發你的代碼不處理異常,BackgroundWorker的捕捉異常,並將其傳遞到該RunWorkerCompleted事件處理程序,它被暴露System.ComponentModel.RunWorkerCompletedEventArgs的錯誤屬性「。 – dlev

+1

與WPF無關。給http://www.albahari.com/threading/一個閱讀,這將花費時間! – Yahya

回答

7

每個線程都有自己的調用堆棧;異常只能向上移動自己的調用堆棧,他們無法「流血」進入另一個線程的調用堆棧。

當你的異常冒泡到觸發DoWork事件處理程序的BackgroundWorker代碼時,異常最終將被明確捕獲並存儲在Error屬性中,而不是允許它到達調用堆棧的頂部並使應用程序崩潰。

如果您希望程序結束時,如果您的BGW拋出一個異常,那麼你就需要處理完成的情況下,檢查是否有異常,然後再扔掉它或者拋出一個新的異常。

+1

在後臺線程的異常也會導致應用程序崩潰,在這種情況下,BackgroundWorker的類設計,如果拋出異常不是應用程序崩潰。 – skjagini

+0

@SujithJagini你是對的;編輯。 – Servy

4

看這裏,有一個很好的例子。在throwned在RunWorkercompleted例外

Unhandled exceptions in BackgroundWorker

var worker = new BackgroundWorker(); 
worker.DoWork += (sender, e) => 
    { 
     throw new InvalidOperationException("oh shiznit!"); 
    }; 
worker.RunWorkerCompleted += (sender, e) => 
    { 
     if(e.Error != null) 
     { 
      MessageBox.Show("There was an error! " + e.Error.ToString()); 
     } 
    }; 
worker.RunWorkerAsync(); 
相關問題