BackgroundWorker 在运行时如何从 UI 线程获取值?

use*_*184 2 vb.net

我正在使用BackgroundWorker 来执行繁重的任务,这样UI 线程就不会被阻塞。虽然BackgroundWorker 可以使用进度方案将值发送到UI 线程,但是BackgroundWorker 如何从UI 线程获取一些值呢?

是通过询问还是简单地通过 UI 线程向 BackgroundWorker 发送一些值?

仅在BackgroundWorker中访问像UIForm.x这样的UI线程的变量是行不通的,它似乎无法访问UI变量???

非常感谢

Oli*_*bes 5

除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)