0

私のプログラムでは、フォームの読み込み時に入力される Datatable を使用しています。そして、バックグラウンドワーカーを使用してネットワーク操作を行います。backgroundworker の doWork() 内では、データテーブルからのデータと、フォームの読み込みで作成したクラスのオブジェクトが必要です。データテーブルとクラスオブジェクトのデータは Dowork() 内で更新され、データテーブルとクラスオブジェクトからのこの値もバックグラウンドワーカーの ProgressChanged のリストビューで更新されます。データテーブルとクラス オブジェクトの両方が Form1 に対してグローバルに宣言されています。しかし、これはスレッドセーフではないことを読みました。スレッドセーフな方法で正しく使用するにはどうすればよいですか?

4

1 に答える 1

0

RunWorkerAsync から DoWork に 1 つの引数を渡すことができます。これは、すべてを取得するための配列にすることができます。

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 について読み始めることができます。おそらくたくさんありますが、おそらく私が持っていたこの質問は、これの良いサンプルかもしれません:
プログレスバーとコードの場所 (vb.net) のマルチスレッド?

于 2012-10-28T17:23:30.330 に答える