.NET Backgroundworker - 有没有办法让异常正常传回主线程?

时间:2010-03-29 00:16:02

标签: .net winforms backgroundworker

问题:重新使用.NET Backgroundworker,有没有办法让异常正常传回主线程?

背景:

  • 目前在我的WinForms应用程序中,我有一般的异常句柄,如果(a)自定义应用程序异常然后呈现给用户,但不退出程序,以及(b)如果出现其他异常,然后退出申请
  • 以上情况很好,因为我可以在应用程序的任何地方抛出相应的异常,并且一般地处理演示文稿/处理

4 个答案:

答案 0 :(得分:6)

BackgroundWorker自动传回异常。当您挂钩RunWorkerCompleted事件时,它位于AsyncCompletedEventArgs.Error属性中。

如果您愿意,可以在此事件处理程序中包装并重新抛出异常 - 请记住,框架中有一个bug会导致“外部”异常被抛出,因为您处于在Invoke

的中间

在.NET应用程序中的后台线程上发生的异常是一个灾难性的错误,它可以并且会导致整个过程失败;处理此问题的唯一方法是将所有活动包装在try-catch块中并保存发生的任何异常,这正是BackgroundWorker所做的。

答案 1 :(得分:2)

如果DoWork调用的异步方法抛出异常,则该异常将对RunWorkerCompleted处理程序可用。你可以在那里处理它。

private void backgroundWorker1_RunWorkerCompleted(
    object sender, RunWorkerCompletedEventArgs e)
{
    // First, handle the case where an exception was thrown.
    if (e.Error != null)
    {
        MessageBox.Show(e.Error.Message);
    }
    ...
}

来自MSDN

  

如果在期间引发异常   异步操作,类会   为错误分配例外   属性。客户端应用程序   事件处理程序委托应该检查   访问前的Error属性   类中的任何属性派生自   AsyncCompletedEventArgs;除此以外,   该物业将提出一个   TargetInvocationException及其   InnerException属性持有一个   参考错误。

答案 2 :(得分:1)

不,没有。

相反,您可以创建一个继承BackgroundWorker并覆盖OnRunWorkerCompleted的类来检查e.Error并运行异常处理程序(如果它不是null

答案 3 :(得分:0)

您是否尝试过静态Application.ThreadException事件?