目前我遇到一个奇怪的问题,我根本就不明白。我有一个简单的GUI,只有一个按钮&一个richeditbox。我有一个异步套接字正在运行,我通过网络接收一些数据,我想打印到gui(richeditbox)。当用户点击按钮时,异步套接字正在启动。所以当我收到网络数据时,我调用一个打印数据的函数,这里看起来是这样的(在form1类中):
Public Sub AddText(ByVal text As String)
Try
Console.WriteLine(text)
RichTextBox1.AppendText(text)
RichTextBox1.AppendText(vbNewLine)
Catch e As Exception
Console.WriteLine(e.ToString())
End Try
End Sub
然后我只是从我的网络类或模块中做Form1.AddText(..)
(这有关系吗?)。问题是,即使调用了AddText
函数,没有任何东西出现在richeditbox中,也没有异常,没有错误。我已经通过调试器查看了它,"text"
包含了必须打印的数据,但是没有任何内容出现......任何人都有想法?
答案 0 :(得分:1)
如果套接字在另一个线程上运行(当然,这是因为它是异步的),您可能必须使用InvokeRequired才能使RichTextBox显示文本。我在异步串口侦听器上遇到类似的问题。
答案 1 :(得分:1)
我很确定大卫是对的。这是一个例子。
Delegate Sub AddTextDelegate(ByVal text as String)
Public Sub AddText(ByVal text as String)
If Me.InvokeRequired Then
Me.Invoke(new AddTextDelegate(AddressOf Me.AddText), new object() { text })
Else
Try
Console.WriteLine(text)
RichTextBox1.AppendText(text)
RichTextBox1.AppendText(vbNewLine)
Catch e as Exception
Console.WriteLine(e.ToString())
End Try
End If
End Sub
这笔交易是必须在创建它们的线程上更新控件。听起来像是在异步套接字线程的上下文中调用AddText()例程。 AddText()例程的行为类似于递归函数。第一次调用它时,InvokeRequired属性将为true。这将导致通过Invoke()调用再次调用它,该调用负责将数据封送到正确的线程。第二次调用时,InvokeRequired将为false,控件将被更新。
答案 2 :(得分:0)
固定。我无法使用Form1来调用函数,因为它是一个类型,它就像一个带有自己内存的新var,因为它是一个diff线程。因此,当我检查InvokeRequired时,它表示false,因为Form1属于该Thread,因此没有显示任何文本,因为我甚至没有看到该表单。因此,只需创建一个全局变量,例如Public myForm As Form1,并将myForm分配给Form1_Load中的Form1。