在我的程序中,我使用的数据表是在加载表单时填充的。我使用backgroundworker来做一些网络操作。在backgroundworker里面的doWork()我需要来自datatable的数据,以及我在加载表单时创建的类的对象。数据表和类对象中的数据在Dowork()中更新,并且数据表和类对象中的这些值在后台工作程序的ProgressChanged中的listivew中更新。 数据表和类对象都声明为Form1的全局。 但我读到这不是线程安全的。那么如何正确使用它以线程安全的方式使用它?
答案 0 :(得分:0)
您可以将一个参数从RunWorkerAsync传递给DoWork,这可以是一个数组来实现它:
dim bgw as new BackgroundWorker
dim dt as DataTable
dim anything as ...
...
bgw.RunWorkerAsync(New Object() {dt, anything, ...})
...
在doWork中:
Private Sub BGW_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
Dim dt as DataTable
dt = TryCast(e.Argument(0), DataTable)
' and so on
只要您开始修改表单上与UI相关的任何内容,就可以开始阅读有关BeginInvoke和InvokeRequired的内容。那里可能有很多,但也许这个问题可能是一个很好的样本:
Multithreading for a progressbar and code locations (vb.net)?