我正在使用BackgroundWorker 来执行繁重的任务,这样UI 线程就不会被阻塞。虽然BackgroundWorker 可以使用进度方案将值发送到UI 线程,但是BackgroundWorker 如何从UI 线程获取一些值呢?
是通过询问还是简单地通过 UI 线程向 BackgroundWorker 发送一些值?
仅在BackgroundWorker中访问像UIForm.x这样的UI线程的变量是行不通的,它似乎无法访问UI变量???
非常感谢
除UI线程之外的其他线程不允许访问UI。您可能使用 启动了BackgroundWorker worker.RunWorkerAsync()。您也可以使用 启动它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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6319 次 |
| 最近记录: |