我已经使用BackgroundWorker
了多年,并且对它非常了解。
就在最近,当我只是进入时,我RunWorkerCompleted
还没有抓住。但是引发了未处理的异常。赶上并不是最佳实践,因此毫无意义。e.Error
Throw New Exception("Test")
DoWork
DoWork
e.Error
当我尝试创建新Form
新BackgroundWorker
,e.Error
在RunWorkerCompleted
成功地处理。我复杂的东西应该出毛病了BackgroundWorker
。
经过几天的谷歌搜索和调试,尝试执行错误。我在我的RunWorkerCompleted
:
e.Error
首先检查,然后e.Cancelled
最后检查e.Result
- 不要得到
e.Result
if e.Cancelled = True
。
- 不要得到
e.Result
if e.Error
not null
(或Nothing
)**
**这是我想念的地方。如果尝试使用e.Result
if e.Error
not 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
任何地方。