您所描述的不是BackgroundWorker的已定义行为。我怀疑您做错了。
这是一个小示例,证明BackgroundWorker在 DoWork中 吃了异常,并在 RunWorkerCompleted
中将它们提供给您:
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. }}VOILA,您将不会收到运行时异常。



