[英]BackgroundWorker exception handling
我正在使用以下組件:
我正在使用后台工作程序調用庫方法。 該庫將引發異常,但不會調用RunWorkerCompleted處理程序。
捕獲異常的唯一方法是用try / catch塊包圍我的DoWork處理程序代碼。
是否誤解了RunWorkerCompletedEventArgs.Error屬性? 難道不是要獲取BackgroundWorker捕獲的異常嗎?
代碼樣本:
static BackgroundWorker w = new BackgroundWorker();
w.DoWork += new DoWorkEventHandler(w_DoWork);
w.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(w_RunWorkerCompleted);
w.RunWorkerAsync();
static void w_DoWork(object sender, DoWorkEventArgs e)
{
MyClass m = new MyClass();
w.result = m.Compute();
}
static void w_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
HandleException(e.Error);
}
/* result related code */
}
static void HandleException(Exception e)
{
ExceptionPolicy.HandleException(e, "MyPolicy");
}
上面的示例導致我的控制台應用程序終止。 vs2010輸出絕對不寫入任何內容(僅默認輸出)。
那么問題出在哪里呢?
//編輯:此代碼段用於捕獲庫的異常。
static void w_DoWork(object sender, DoWorkEventArgs e)
{
try
{
MyClass m = new MyClass();
w.result = m.Compute();
}catch(Exception e){ }
}
這是BackgroundWorker的正確模式。
我懷疑問題是在BW完成之前您的Main
方法正在退出。
RunWorkerAsync
將立即返回,如果您不在Main
等待,那么您的過程可能會結束,也許甚至在BW開始之前也沒關系完成。
嘗試在Main
方法的末尾添加Console.ReadLine
。
不感興趣:
BW在控制台應用程序和Windows應用程序中的行為有所不同。 如果使用WinForms或WPF應用程序,則UI線程上將有派生的SynchronizationContext,並且BW將把RunWorkerCompleted
編組回UI線程並在其中運行。 這是BW的主要好處之一。
在控制台應用程序中,使用默認的SynchronizationContext,並將RunWorkerCompleted
編組到線程池線程上。 這意味着您可以阻止Main
線程,並且完成的處理程序仍將運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.