Threads other than the user interface thread do not have access to the user interface. You probably started BackgroundWorker with worker.RunWorkerAsync()
. You can also run it with worker.RunWorkerAsync(someObject)
. While the worker is working, you cannot transfer new objects, but you can change the contents of the object itself. Because object types are reference types, the user interface thread and the workflow 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
source share