【问题标题】:How can the BackgroundWorker get values from the UI thread while it is running?BackgroundWorker 在运行时如何从 UI 线程获取值?
【发布时间】:2012-01-02 13:12:30
【问题描述】:

我正在使用 BackgroundWorker 执行繁重的任务,因此 UI 线程不会被阻塞。虽然 BackgroundWorker 可以使用进度方案向 UI 线程发送值,但 BackgroundWorker 如何从 UI 线程获取一些值?

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

只访问BackgroundWorker中的UIForm.x之类的UI线程的变量是行不通的,它似乎没有访问UI变量的权限???

非常感谢

【问题讨论】:

  • RunWorkerAsync() 可以将对象作为参数。它可以是您创建的用于存储工作人员需要的 UI 值的类的对象。
  • 谢谢,但我不需要这些值来启动 worker - worker 必须在 UI 线程已经运行时多次获取值。我应该在我的问题中更清楚地说明这一点......
  • 那你做错了。值何时发生变化是完全不可预测的,保持工作人员运行并等待用户再次醒来是没有意义的。当这样的值发生变化时,只需重新启动 worker。
  • 它的工作方式是在 UI 中输入一个值,这应该在某个时候以某种方式转到 BackgroundWorker - 什么时候不重要

标签: vb.net


【解决方案1】:

UI 线程以外的其他线程不允许访问 UI。您可能使用worker.RunWorkerAsync() 启动了BackgroundWorker。您也可以使用worker.RunWorkerAsync(someObject) 启动它。当worker运行时,你不能传递新的对象,但是你可以改变对象本身的内容。由于对象类型是引用类型,因此 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多