我已经使用BackgroundWorker了多年,并且对它非常了解。
就在最近,当我只是进入时,我RunWorkerCompleted还没有抓住。但是引发了未处理的异常。赶上并不是最佳实践,因此毫无意义。e.ErrorThrow New Exception("Test")DoWorkDoWorke.Error
当我尝试创建新Form新BackgroundWorker,e.Error在RunWorkerCompleted成功地处理。我复杂的东西应该出毛病了BackgroundWorker。
经过几天的谷歌搜索和调试,尝试执行错误。我在我的RunWorkerCompleted:
e.Error首先检查,然后e.Cancelled最后检查e.Result
- 不要得到
e.Resultif e.Cancelled = True。
- 不要得到
e.Resultif e.Errornot null(或Nothing)**
**这是我想念的地方。如果尝试使用e.Resultif e.Errornot null(或Nothing),则将引发Unhandled Exception。
更新:
在e.Result.NET设计的get属性中,e.Error首先进行检查,如果发现错误,则它们将重新抛出与相同的异常DoWork。这就是为什么我们收到Unhandled异常,RunWorkerCompleted但实际上异常来自的原因DoWork。
这是在中执行的最佳做法RunWorkerCompleted:
If e.Error IsNot Nothing Then
' Handle the error here
Else
If e.Cancelled Then
' Tell user the process canceled here
Else
' Tell user the process completed
' and you can use e.Result only here.
End If
End If
如果要使所有DoWork,ProgressChanged和RunWorkerCompleted都可以访问的对象,请像这样使用:
Dim ThreadInfos as Dictionary(Of BackgroundWorker, YourObjectOrStruct)
您可以轻松访问所需的ThreadInfos(sender).Field任何地方。