在 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