Vb.net 将文本附加到不同线程和代码文件中的richTextBox

Vb.net 将文本附加到不同线程和代码文件中的richTextBox,vb.net,serial-port,richtextbox,invoke,Vb.net,Serial Port,Richtextbox,Invoke,为了创建一个与串口设备接口的程序,我最近开始学习vb.net。为了保持结构整洁,vb代码被分为两个位置;第一个是用于初始化、单击按钮等的代码,而第二个是用于管理通信端口。分别命名为“MainWindow.xaml.vb”和“ComPortManager.vb” 在“comPortManager.vb”中: Dim RXArray(2047) As Char ' Array to hold received characters Dim RXCnt As Integer ' Receiv

为了创建一个与串口设备接口的程序,我最近开始学习vb.net。为了保持结构整洁,vb代码被分为两个位置;第一个是用于初始化、单击按钮等的代码,而第二个是用于管理通信端口。分别命名为“MainWindow.xaml.vb”和“ComPortManager.vb”

在“comPortManager.vb”中:

Dim RXArray(2047) As Char ' Array to hold received characters
Dim RXCnt As Integer      ' Received character count

    Private Sub comPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles comPort.DataReceived
        Do
            RXCnt = 0
            Do
                 'Populates the array, RXArray and counts the number of characters, RXCnt
            Loop Until (comPort.BytesToRead = 0) 'Keeps reading the buffer until it is empty
            'Code for posting to the richTextBox
        Loop Until (comPort.BytesToRead = 0) 'If the buffer has been written to in the meantime, repeat
    End Sub
“MainWindow.xaml”包含一个功能区(微软2010年10月发布的版本),带有设置、打开、关闭和发送控件(暂时保持独立和简单),窗口的其余部分是一个名为“RichTextBox1”的richTextBox

在搜索将RXArray的内容发布到RichTextBox1的方法时,提出了许多关于Invoke或BeginInvoke的建议。事实上,工作示例已经成功运行,但与Invoke关联的所有代码都已保存在一个文件中,即代码隐藏。(如果我错了,请纠正我,但这对于小程序来说听起来不错,但对于中到大的程序来说可能会变得臃肿,因此我希望找到更好的解决方案)

最接近运行的代码(我相信)如下所示:

'在comPort_DataReceived中。。。填充数组后

If RichTextBox1.InvokeRequired Then
                RichTextBox1.Invoke(New MethodInvoker(AddressOf Display))
            End If
'并返回主代码

Public Delegate Sub MethodInvoker()

Private Sub Display()
    RichTextBox1.AppendText(New String(RXArray, 0, RXCnt))
End Sub
这有一些问题,我不确定在这个阶段应该朝什么方向发展。RichTextBox1位于不同的线程中,因此无法识别;InvokeRequired不是System.Windows.Controls.RichTextBox的成员,Invoke也是;最后,在示例中,名为MethodInvoker的委托从未像上面那样声明过


在此主题上的任何帮助都将不胜感激。在这几周里,Invoke、BeginInvoke等都有点让我难以理解。关于Jonathan,我们有一个大型应用程序,其中一个文本框具有多个线程同时附加到它的状态,并且来自不同的形式。这是它的一个简化版本:

Public Sub addToMessageBox(ByVal msg As String)
    If Me.InvokeRequired Then
      Dim d As New AddToMessageBoxDelegate(AddressOf Me.addToMessageBox)
      Me.BeginInvoke(d, New Object() {msg})
    Else
      Try
        Me.MessageBox.AppendText("--" + msg + vbCrLf)
      Catch ex As Exception
      End Try
    End If
  End Sub
委托在开始时声明

Private Delegate Sub AddToMessageBoxDelegate(ByVal msg As String)

我能看到的最大区别是,我使用父类的beginInvoke()和InvokeRequired()。我想试试这个。在调用display()的地方调用parentClass.AddToMessageBox(“要追加的文本”)。

谢谢您的回复,我正在尝试。