【问题标题】:VB.NET WinForms - How to access objects of main thread from BackgroundWorker's thread?VB.NET WinForms - 如何从 BackgroundWorker 的线程访问主线程的对象?
【发布时间】:2011-10-19 17:17:18
【问题描述】:

我正在使用BackgroundWorker,我希望BackgroundWorker 执行从数据库中检索数据的过程,而用户仍然可以在表单上执行其他任务。问题是,在检索数据后,我似乎无法从BackgroundWorkerDoWork 事件访问我的Form 中的ListView,我将使用我检索到的数据填充该ListView。我该怎么办?我错过了什么吗?

考虑这个例子,我就是这样做的:

Public Class Test
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        BackgroundWorker1.RunWorkerAsync()
    End Sub

    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Label1.Text = "Hello World"
    End Sub
End Class

【问题讨论】:

  • 发布你尝试过的东西...
  • @Binil 我认为问题很明确。如果您知道这一点,则不需要源代码。
  • @Binil 我已经编辑了我的问题,一个简单的问题。无论如何感谢您的回复。

标签: vb.net winforms multithreading backgroundworker


【解决方案1】:

DoWorkEventArgs 包含一个 Argument 属性,您可以在其中存储任何对象,例如包含操作 UI 指令的用户定义类。

【讨论】:

    【解决方案2】:

    BackgroundWorker 的文档很清楚:

    您必须小心不要在DoWork 事件处理程序中操纵任何用户界面对象。相反,通过ProgressChangedRunWorkerCompleted 事件与用户界面进行通信。


    示例"How to: Download a File in the Background" 展示了一种可以在主线程和后台工作线程之间共享对象的示例方法 - 通过安排将此类对象存储在类级别的变量中。

    【讨论】:

    • 那么我如何将我从DoWork 完成的对象传递给任何函数、对象或ProgressChanged
    • @domanokz - 我添加了一个指向另一个示例的链接,该示例显示了在工作线程和 UI 线程之间共享对象的一种方法。
    • 谢谢!这解决了我的第一个问题,现在我的问题是如何将参数传递给DoWork,因为我无法访问其他控件。嗯,我会找到的。再次感谢!
    • 哈哈!就像BackgroundWorker1.RunWorkerAsync("Hello Asynchronous World") 一样简单。我将它们提取到DoWork
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多