您所描述的不是BackgroundWorker 的定义行为。我怀疑你做错了什么。
这是一个小示例,证明了BackgroundWorker在以下情况下会发生异常:DoWork,并让您可以使用它们运行工作完成:
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
throw new InvalidOperationException("oh shiznit!");
};
worker.RunWorkerCompleted += (sender, e) =>
{
if(e.Error != null)
{
MessageBox.Show("There was an error! " + e.Error.ToString());
}
};
worker.RunWorkerAsync();
我的通灵调试技巧向我揭示了你的问题:你正在 RunWorkerCompleted 处理程序中访问 e.Result - 如果存在 e.Error,则必须在不访问 e.Result 的情况下处理它。比如下面的代码就不好,不好,不好,运行时会抛出异常:
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
throw new InvalidOperationException("oh shiznit!");
};
worker.RunWorkerCompleted += (sender, e) =>
{
// OH NOOOOOOOES! Runtime exception, you can't access e.Result if there's an
// error. You can check for errors using e.Error.
var result = e.Result;
};
worker.RunWorkerAsync();
以下是 RunWorkerCompleted 事件处理程序的正确实现:
private void RunWorkerCompletedHandler(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error == null)
{
DoSomethingWith(e.Result); // Access e.Result only if no error occurred.
}
}
瞧,您不会收到运行时异常。