【问题标题】:BackgroundWorker & ExceptionsBackgroundWorker 和异常
【发布时间】:2010-11-25 09:22:13
【问题描述】:

MSDN Docs

如果操作引发了您的代码未处理的异常,BackgroundWorker 会捕获该异常并将其传递给 RunWorkerCompleted 事件处理程序,在该处理程序中它作为 System.ComponentModel.RunWorkerCompletedEventArgs 的 Error 属性公开

但是当我尝试时

_workers[i].DoWork += (s, args) =>
{
    throw new Exception("Error!");
};

我得到 Exception Unhandled 错误...代码似乎没有转到 RunWorkerCompleted。错误应该如何处理?

更新

我已经设置了简单的处理程序

_workers[i].DoWork += (s, args) =>
{
    throw new Exception("Error!");
}
...
_workers[i].RunWorkerCompleted += (s, args) =>
{
    if (args.Error != null) {
        string dummy = args.Error.Message;
    }
    ...
};

代码永不离开DoWork

【问题讨论】:

  • 你有 RunWorkerCompleted 处理程序吗?
  • 你试过没有调试器的代码吗?
  • 刚刚完成,代码确实转到了RunWorkComplete 处理程序,只是它似乎一直“循环”在那里?见screenr.com/eCF。由于我不能使用 VS Debug,我真的不知道为什么它一直在循环......我刚刚添加了 1 个任务

标签: c# exception backgroundworker


【解决方案1】:

如果抛出异常并通过用户框架但未被用户代码捕获,则将其视为“用户未处理”。

所以我认为有3种可能:

  • 这是first-chance exception - 因此,如果您按 F5,异常将正常传播。
  • 单击异常助手中的“编辑代码”。然后做一些编辑并继续解决问题。
  • 转到 Debug->Exceptions 并取消选择“user-unhandled”列。

【讨论】:

    【解决方案2】:

    如果您正在通过调试器运行,Visual Studio 将在 BackgroundWorker.DoWork 事件处理程序中出现异常时停止,而不是静默地将异常传递给 RunWorkerCompleted 事件,这在不在调试器中时会发生。

    1) 您可以按 F5 并继续执行以遵循异常(如 RoadWarrior 所述)

    2) 如果这太烦人了,对于DoWork,不要使用委托/lambda,而是使用命名方法并使用[DebuggerStepThrough] 属性进行装饰。这将使调试器忽略该方法并且不会在异常时停止,因此您可以查看 Backgroundworker 的“正常”行为。

    见:Visual Studio 2008 Debugging - Skipping code

    【讨论】:

    • 您能否解释一下为什么我的 Visual Studio 没有停止 DoWork 事件中引发的异常,正如您的 (1) 所述?一定有一些我希望的设置
    【解决方案3】:

    我昨天在BackgroundWorker 中完成了异常处理。我没有在 Worker 的 DoWork 处理程序中添加任何抛出。如果发生异常,您将能够在 RunWorkerCompleted 中获取它而无需抛出它。如果发生异常,请不要忘记取消您的 Worker。

    【讨论】:

    • 我想当你扔的时候,执行立即结束?所以我不能将Cancel = true 设置为我的工人?
    猜你喜欢
    • 2012-05-05
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多