【问题标题】:.NET Backgroundworker - Is there no way to let exceptions pass back normally to main thread?.NET Backgroundworker - 有没有办法让异常正常传递回主线程?
【发布时间】:2010-03-29 08:30:05
【问题描述】:

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

背景:

  • 目前在我的 WinForms 应用程序中,我有通用异常句柄,如果 (a) 自定义应用程序异常然后呈现给用户,但不退出程序,以及 (b) 如果其他异常出现并且然后退出应用程序
  • 以上内容很好,因为我可以在应用程序的任何地方抛出适当的异常,并且呈现/处理是通用的

【问题讨论】:

    标签: .net winforms backgroundworker


    【解决方案1】:

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

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

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

    【讨论】:

    • @Aaronaught - 你的意思是“这会导致“内部”异常被抛出吗? (感谢回复)
    • 知道了!我刚刚在 backgroundWorker1_RunWorkerCompleted 中创建了一个新的 BusinessException 并将 innerException 设置为“null”。
    【解决方案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 属性持有 参考错误。

    【讨论】:

      【解决方案3】:

      不,没有。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-17
          • 1970-01-01
          • 2019-06-18
          • 1970-01-01
          • 1970-01-01
          • 2011-12-13
          相关资源
          最近更新 更多