在vb.net中运行线程

时间:2009-09-13 20:05:38

标签: vb.net multithreading

我有一个应用程序,我正在运行一个单独的线程。

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。

我可能在这里遗漏了一些重要的东西,谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

您需要强制它在正确的线程上执行,而不是仅调用AppendText方法。所以,如果你有这样的电话:

myTextBox.AppendText("some text")

...您需要将其更改为:

myTextBox.BeginInvoke(New Action(Of String)(AddressOf myTextBox.AppendText), "some text")

您可以使用InvokeBeginInvoke。在这种情况下,由于AppendText没有任何返回值,BeginInvoke是一个不错的选择(区别在于Invoke将阻止当前线程,而GUI线程执行AppendText 1}}方法,而BeginInvoke将异步调用。)

答案 1 :(得分:1)

您应该使用Control.Invoke或Control.BeginInvoke来调用您的子例程。

答案 2 :(得分:1)

使用线程时,此异常是一个非常流行的异常。某些操作不是线程安全的(比如访问除其自己的线程之外的线程上的控件),因此框架可以防止出现这类问题。 要解决此问题,您可以使用Control.Invoke方法来调用与控件位于同一线程中的委托,也可以使用后台工作程序。

Here你可以找到第一种方法的样本

Here您可以找到后台工作人员的样本