0

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

4

1 回答 1

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)?

于 2012-10-28T17:23:30.330 回答