我有一個具有BackgroundWorker
的WPF應用程序。我在這個BGW中拋出了一個例外,但是它並沒有在任何地方顯示出來,只是後臺工作人員觸發了其事件。爲什麼我的例外在wpf應用程序中沒有任何區別?
去哪裏?
我有一個具有BackgroundWorker
的WPF應用程序。我在這個BGW中拋出了一個例外,但是它並沒有在任何地方顯示出來,只是後臺工作人員觸發了其事件。爲什麼我的例外在wpf應用程序中沒有任何區別?
去哪裏?
每個線程都有自己的調用堆棧;異常只能向上移動自己的調用堆棧,他們無法「流血」進入另一個線程的調用堆棧。
當你的異常冒泡到觸發DoWork
事件處理程序的BackgroundWorker代碼時,異常最終將被明確捕獲並存儲在Error
屬性中,而不是允許它到達調用堆棧的頂部並使應用程序崩潰。
如果您希望程序結束時,如果您的BGW拋出一個異常,那麼你就需要處理完成的情況下,檢查是否有異常,然後再扔掉它或者拋出一個新的異常。
看這裏,有一個很好的例子。在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();
從上'BackgroundWorker' MSDN的條目:「如果操作引發你的代碼不處理異常,BackgroundWorker的捕捉異常,並將其傳遞到該RunWorkerCompleted事件處理程序,它被暴露System.ComponentModel.RunWorkerCompletedEventArgs的錯誤屬性「。 – dlev
與WPF無關。給http://www.albahari.com/threading/一個閱讀,這將花費時間! – Yahya