Other threads than the UI thread are not allowed to access the UI. You probably started the BackgroundWorker with worker.RunWorkerAsync()
. You can also start it with worker.RunWorkerAsync(someObject)
. While the worker is running, you cannot pass new objects, but you can alter the contents of the object itself. Since object types are reference types, the UI thread and the worker thread will see the same object content.
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