UIスレッド以外のスレッドはUIにアクセスできません。あなたはおそらくworker.RunWorkerAsync()
でBackgroundWorkerを開始しました。 worker.RunWorkerAsync(someObject)
で開始することもできます。作業者が実行中は、新しいオブジェクトを渡すことはできませんが、オブジェクト自体の内容を変更することはできます。オブジェクト型は参照型なので、UIスレッドとワーカースレッドは同じオブジェクトコンテンツを参照します。
Imports System.ComponentModel
Imports System.Threading
Class BgWorkerCommunication
Private _worker As BackgroundWorker
Private Class WorkParameters
Public text As String
End Class
Public Sub DoRun()
Dim param = New WorkParameters()
_worker = New BackgroundWorker()
AddHandler _worker.DoWork, New DoWorkEventHandler(AddressOf _worker_DoWork)
AddHandler _worker.RunWorkerCompleted, New RunWorkerCompletedEventHandler(AddressOf _worker_RunWorkerCompleted)
param.text = "running "
_worker.RunWorkerAsync(param)
While _worker.IsBusy
Thread.Sleep(2100)
param.text += "."
End While
End Sub
Private Sub _worker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
Console.WriteLine("Completed")
End Sub
Private Sub _worker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
Dim param = DirectCast(e.Argument, WorkParameters)
For i As Integer = 0 To 9
Console.WriteLine(param.text)
Thread.Sleep(1000)
Next
End Sub
End Class
RunWorkerAsync()は、Objectを引数として取ります。これは、作業者が必要とするUI値を格納するために作成するクラスのオブジェクトです。 –
ありがとう、私はワーカーを開始するだけの値を必要としません - ワーカーは既に実行中にUIスレッドから値を数回取得する必要があります。私は私の質問でこれをより明確にすべきだった... – user387184
それは間違っているよ。値が変わるときは全く予測できません。ワーカーを実行しておき、ユーザーが再び起きるのを待つことはありません。そのような値が変更されたときに作業員を再開するだけです。 –