带有异步套接字的Windows窗体;没有文字输出

时间:2009-08-01 23:59:21

标签: vb.net user-interface

目前我遇到一个奇怪的问题,我根本就不明白。我有一个简单的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"包含了必须打印的数据,但是没有任何内容出现......任何人都有想法?

3 个答案:

答案 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。