簡體   English   中英

BackgroundWorker異常處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM