MSDN文档说
如果操作引发代码不处理的异常,BackgroundWorker将捕获该异常并将其传递给RunWorkerCompleted事件处理程序,在该事件处理程序中,该异常将作为BackgroundWorker的错误属性公开。
但当我试着
_workers[i].DoWork += (s, args) =>
{
throw new Exception("Error!");
};我有异常未处理的错误..。代码似乎不属于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

发布于 2010-11-25 10:33:13
如果抛出异常并通过用户帧,但用户代码没有捕获异常,则该异常被视为“用户未处理”。
所以我认为有三种可能性:
发布于 2012-02-29 04:49:28
如果您正在通过调试器运行,Visual将停止BackgroundWorker.DoWork事件处理程序中的异常,而不是将异常悄悄传递给RunWorkerCompleted事件,这是在调试器中不存在时所发生的情况。
1)只需点击F5并继续执行以跟踪异常(如RoadWarrior所述)
2)如果这太烦人了,因为DoWork不使用委托/lambda,而是使用命名方法并使用[DebuggerStepThrough]属性来修饰。这将使调试器忽略该方法,而不会在异常情况下停止,这样您就可以查看背景工作者的“正常”行为。
发布于 2010-11-25 10:14:03
我昨天在BackgroundWorker中做了异常处理。我没有在工人的DoWork处理程序中添加任何附加项。如果发生异常,您将能够在RunWorkerCompleted中获得它,而无需抛出它。只是别忘了,如果出现异常,就取消你的员工。
https://stackoverflow.com/questions/4275436
复制相似问题