VB.NET跨线程访问无效

VB.NET跨线程访问无效,vb.net,multithreading,backgroundworker,Vb.net,Multithreading,Backgroundworker,我有一个窗体上的后台工作控件 在这个表格中,我有另一个显示进度的表格: Private _fWait As frmWait 我正在更新此表单,更改其标签以告知用户当前正在进行的操作 后台工作程序完成后,我想关闭此表单 我正在使用 Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles Backgrou

我有一个窗体上的后台工作控件

在这个表格中,我有另一个显示进度的表格:

Private _fWait As frmWait
我正在更新此表单,更改其标签以告知用户当前正在进行的操作

后台工作程序完成后,我想关闭此表单

我正在使用

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

    'do the background worker stuff. I have not stated it here because it is not important

    _fWait.Close()

    _bDone = True

End Sub
但我在“_fWait.Close()”行上收到了错误“无效的跨线程访问:对控件frmWait的访问来自与创建它的线程不同的线程”

有人能告诉我我做错了什么吗


谢谢大家!

当您调用
\u fWait.Close()
时,必须在UI线程上调用is,而
BackgroundWorker1\u DoWork
处理程序将在另一个线程上运行,这就是为什么会出现错误的原因。关闭表单有两个选项:

1) 继续在
DoWork
处理程序上关闭表单,但使用类似以下代码的方式将请求封送到UI线程:

this.Invoke(() => _fWait.Close());
我已经有一段时间没用VB了,所以你必须把C代码转换成VB…对不起

2) 处理
RunWorkerCompleted
事件并将其关闭。如果您的BackgroundWorker是在 UI线程,然后也将在UI线程上调用
RunWorkerCompleted


如果我没记错的话,
ProgressedChanged
事件也将在UI上调用,假设
BackgroundWorker
是在UI线程上创建的。如果
BackgroundWorker
是在另一个线程中创建的,那么
RunWorkerCompleted
ProgressChanged
也将在单独的线程上调用,并且您必须按照上述步骤1中所述封送对UI的调用。

在简单程序中,通过将此项添加到表单中,可以忽略跨线程错误。加载方法:

CheckForIllegalCrossThreadCalls = False
请注意,当运行多个访问共享数据的异步线程时,它可能会导致问题,因此不要随意使用它



如果多个线程导致共享例程运行,请使用以防止多个同时实例。

backgroundworker确实在另一个线程上工作,因此此处的任何调用都已在diff线程上。这是您运行长流程工作,然后访问worker\u completed或progress\u changed事件中的控件的地方。我记得在某个地方读到,您指定的属性更适合调试,并且在运行时仍将引发异常。也许其他人可以证实这一点。无论哪种方式,忽略这些异常都不是好的做法,我建议确保在正确的线程上完成任何UI工作。