我有一个应用程序,我正在运行一个单独的线程。
Dim thread As New System.Threading.Thread(AddressOf Main)
thread.Start()
但是,该线程引用了一个名为Output的文本框,并在执行时生成此错误:
System.InvalidOperationException was unhandled
Message="Cross-thread operation not valid: Control 'Output' accessed from a thread other than the thread it was created on."
Source="System.Windows.Forms"
(消息缩短了空格)
如何让操作在另一个线程上运行,但仍然使用Output对象?我无法调用子程序为我做这件事,因为它会产生完全相同的错误。
顺便说一下,调用的方法是AppendText。
我可能在这里遗漏了一些重要的东西,谢谢你的帮助!
答案 0 :(得分:2)
您需要强制它在正确的线程上执行,而不是仅调用AppendText
方法。所以,如果你有这样的电话:
myTextBox.AppendText("some text")
...您需要将其更改为:
myTextBox.BeginInvoke(New Action(Of String)(AddressOf myTextBox.AppendText), "some text")
您可以使用Invoke
或BeginInvoke
。在这种情况下,由于AppendText
没有任何返回值,BeginInvoke
是一个不错的选择(区别在于Invoke
将阻止当前线程,而GUI线程执行AppendText
1}}方法,而BeginInvoke
将异步调用。)
答案 1 :(得分:1)
您应该使用Control.Invoke或Control.BeginInvoke来调用您的子例程。
答案 2 :(得分:1)