在 BackgroundWorker 中访问 GUI 组件

你无法从 BackgroudWorker 访问任何 GUI 组件。例如,如果你尝试做这样的事情

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
    TextBox1.Text = "Done"
End Sub

你将收到一个运行时错误,指出“跨线程操作无效:控制’TextBox1’从其创建的线程以外的线程访问。”

这是因为 BackgroundWorker 在与主线程并行的另一个线程上运行你的代码,并且 GUI 组件不是线程安全的。你必须使用 Invoke 方法将代码设置为在主线程上运行,并为其指定代理:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
    Me.Invoke(New MethodInvoker(Sub() Me.TextBox1.Text = "Done"))
End Sub

或者你可以使用 BackgroundWorker 的 ReportProgress 方法:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
    Me.BackgroundWorker1.ReportProgress(0, "Done")
End Sub

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs)
    Me.TextBox1.Text = DirectCast(e.UserState, String)
End Sub