2009-09-13 135 views
1

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

Dim thread As New System.Threading.Thread(AddressOf Main) 
thread.Start() 

但是,线程提到了一个文本框命名的输出,并生成在执行时出现此错误:

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。

我可能在这里错过了一些重要的东西,所以感谢您的帮助!

回答

2

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

myTextBox.AppendText("some text") 

...你需要把它改成这样:

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

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

1

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

+0

里面分的样本? – Cyclone 2009-09-13 20:09:05

+0

你能给一个代码示例吗? – Cyclone 2009-09-13 20:12:31

+0

@Cyclone:看到这等岗位使用的InvokeRequired和调用的例子:http://stackoverflow.com/questions/571706/shortest-way-to-write-a-thread-safe-access-method-to-a- Windows的形式控制。 – 2009-09-13 20:20:42

1

此异常使用thread.Some操作时不是线程安全的(比如访问上比它自己的线程以外的线程控制),所以框架是防止这些类型的问题是一个非常受欢迎的例外。 要解决它,您可以使用Control.Invoke方法调用与控件位于同一线程中的委托,也可以使用后台工作器。

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

Here你可以找到一个后台工作