Vb.net 将值从BackgroundWorker DoWork传递给BackgroundWorker Completed

Vb.net 将值从BackgroundWorker DoWork传递给BackgroundWorker Completed,vb.net,variables,backgroundworker,pass-by-value,byval,Vb.net,Variables,Backgroundworker,Pass By Value,Byval,如何将值从BackgroundWorkerDoWork传递到BackgroundWorkerCompleted?由于BackgroundWorkerCompleted不是由BackgroundWorkerDoWork调用的,因此除了声明一个公共变量之外,我不确定如何执行此操作。本质上,我希望BackgroundWorkerCompleted通过ByVal接受BackgroundWorkerDoWork中的一个变量,当您声明DoWork函数时,请注意它内置了一些方便的参数: Private Sub

如何将值从
BackgroundWorker
DoWork
传递到
BackgroundWorker
Completed
?由于
BackgroundWorker
Completed
不是由
BackgroundWorker
DoWork
调用的,因此除了声明一个
公共变量之外,我不确定如何执行此操作。本质上,我希望
BackgroundWorker
Completed
通过
ByVal
接受
BackgroundWorker
DoWork

中的一个变量,当您声明
DoWork
函数时,请注意它内置了一些方便的参数:

Private Sub backgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) _
                                                  Handles backgroundWorker1.DoWork
还要注意
RunWorkerCompleted
处理程序的类似参数:

Private Sub backgroundWorker1_RunWorkerCompleted(ByVal sender As Object, _
                                          ByVal e As RunWorkerCompletedEventArgs) _
                                       Handles backgroundWorker1.RunWorkerCompleted
关键是,您可以访问
RunWorkerCompletedEventArgs
中的
e.Result
,它可以是任何对象,也可以访问
dowworkeventargs
中的
e.Result
——后者在方法完成时传递给前者,因此在您的worker方法结束时,只需设置:

e.Result = myResult
然后在
RunWorkerCompleted
处理程序中,您还可以通过以下方式访问它:

if e.Result = (whatever) then 
    .... etc

参考资料:


我同意您的看法,因为不能保证在同一个线程上执行,所以“共享”数据的最安全方式是将其放入公共变量中,然后使用一些线程安全访问机制来确保没有死锁。