BackgroundWorkerexception处理

我正在使用以下组件:

  • 图书馆(引发例外)
  • 测试我的日志记录的测试控制台
  • 企业库exception处理应用程序块
  • 企业库日志应用程序块

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

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

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

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"); } 

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

那么问题出在哪里?

//编辑:此代码段用于捕获库的exception。

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

这是BackgroundWorker的正确模式。

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

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

尝试在Main方法的末尾添加Console.ReadLine


不感兴趣:

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

在Console App中,使用默认的SynchronizationContext,并将RunWorkerCompleted编组到线程池线程上。 这意味着您可以阻止Main线程,并且仍然会运行已完成的处理程序。