BackgroundWorker异常处理

cst*_*ler 10 c# multithreading enterprise-library exception backgroundworker

我正在使用以下组件:

  • 图书馆(抛出异常)
  • 测试我的日志记录的测试控制台
  • 企业库异常处理应用程序块
  • 企业库日志记录应用程序块

我正在使用backgroundworker调用库方法.库会抛出异常,但永远不会调用RunWorkerCompleted处理程序.

捕获异常的唯一方法是使用try/catch块包围我的DoWork处理程序代码.

是否误解了RunWorkerCompletedEventArgs.Error属性?是不是因为获得了BackgroundWorker捕获的异常?

Codesample:

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");
}
Run Code Online (Sandbox Code Playgroud)

上面的示例导致我的控制台应用程序终止.vs2010输出绝对没有写入(只有默认输出).

那么问题出在哪里?

//编辑:此代码段用于捕获库的异常.

static void w_DoWork(object sender, DoWorkEventArgs e)
{
   try
   {
      MyClass m  = new MyClass();
      w.result = m.Compute();
   }catch(Exception e){ }

}
Run Code Online (Sandbox Code Playgroud)

Nic*_*ler 7

这是BackgroundWorker的正确模式.

我怀疑问题是你的Main方法在BW完成之前就已经退出了.

RunWorkerAsync将立即返回,如果您没有等待Main,那么您的过程将结束,甚至可能在BW开始之前,从不介意完成.

尝试Console.ReadLineMain方法的末尾添加a .


不感兴趣:

BW在Console应用程序和Windows应用程序中的行为有所不同.如果您使用WinForms或WPF应用程序,您的UI线程上将会有一个派生的SynchronizationContext,BW将封RunWorkerCompleted送回UI线程并在那里运行它.这是BW的主要好处之一.

在控制台应用程序中,使用默认的SynchronizationContext,并将其封RunWorkerCompleted送到线程池线程中.这意味着您可以阻止Main线程,完成的处理程序仍将运行.

  • @MartinJames我花了很多时间编写控制台应用程序,这些应用程序可以在服务器上进行调度和运行.用户界面对于这种情况既不有用也不可行.在控制台应用程序中进行简单测试也更容易一些; 只需要做一些简单的事情并查看结果就可以减少开销. (7认同)