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