Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 访问Backgroundworker中的数据表和变量_Vb.net_Multithreading_Backgroundworker - Fatal编程技术网

Vb.net 访问Backgroundworker中的数据表和变量

Vb.net 访问Backgroundworker中的数据表和变量,vb.net,multithreading,backgroundworker,Vb.net,Multithreading,Backgroundworker,在我的程序中,我使用了一个数据表,它是在加载表单时填充的。我用backgroundworker做一些网络操作。在backgroundworker的doWork()中,我需要来自datatable的数据,以及在加载表单时创建的类的对象。datatable和class对象中的数据在Dowork()中更新,datatable和class对象中的此值也在backgroundworker的ProgressChanged中的listivew中更新。 datatable和class对象都声明为Form1的全局

在我的程序中,我使用了一个数据表,它是在加载表单时填充的。我用backgroundworker做一些网络操作。在backgroundworker的doWork()中,我需要来自datatable的数据,以及在加载表单时创建的类的对象。datatable和class对象中的数据在Dowork()中更新,datatable和class对象中的此值也在backgroundworker的ProgressChanged中的listivew中更新。 datatable和class对象都声明为Form1的全局对象。
但是我读到这不是线程安全的。那么如何正确使用以线程安全的方式使用它呢?

您可以将一个参数从RunWorkerAsync传递到DoWork,这可以是一个数组来完成:

dim bgw as new BackgroundWorker
dim dt as DataTable
dim anything as ...
...
bgw.RunWorkerAsync(New Object() {dt, anything, ...})

...
内榫:

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。可能有很多问题,但我的这个问题可能是一个很好的例子:

看看锁定和/或参数化ThreadStart。