首页 > 解决方案 > 调用线程无法访问此对象 (Dispatcher.CheckAccess)

问题描述

我正在尝试在带有 vb.net 的 WPF 中使用串行通信,而我能做的唯一成功的事情就是发送数据。在接收数据时,我收到了不同的错误,这是我最难克服的错误。当我们想使用 Control.InvokeRequired 接收数据时,我尝试应用 windows 窗体代码,但由于这是 WPF,因此它被转移到 Dispatcher.CheckAccess()。每次我加载程序时,传输都正常,但接收给我 System.InvalidOperation 的错误:'调用线程无法访问该对象,因为不同的线程拥有它。我查看了其他解决方案,但没有一个有效。

是否有其他解决方案/流程可以从另一方接收数据?

我尝试了来自 windows 文档和其他站点的各种示例,但在 WPF 应用程序中没有一个成功。

Imports System.IO.Ports
Imports System.Text
Imports System.Threading
Imports System.Windows

Class MainWindow
    Private WithEvents serport As New SerialPort

    Private Delegate Sub SetTextCallback(ByVal [text] As String)

    Private Sub onLoad()
        Dim ports As String() = SerialPort.GetPortNames()
        Dim port As String

        For Each port In ports
            comPortCombo.Items.Add(port)
        Next port


    End Sub


    Private Sub ConButton_Click(sender As Object, e As RoutedEventArgs) Handles conButton.Click
        'serport = New SerialPort()

        If (comPortCombo.Text = "") Then
            MessageBox.Show("Please select COM port!")
            Exit Sub
        End If

        serport.PortName = comPortCombo.Text
        serport.BaudRate = baudCombo.Text

        serport.Open()


        transButton.IsEnabled = True
        conButton.IsEnabled = False
        disconButton.IsEnabled = True
    End Sub

    Private Sub DisconButton_Click(sender As Object, e As RoutedEventArgs) Handles disconButton.Click
        serport.Close()
        disconButton.IsEnabled = False
        transButton.IsEnabled = False
        conButton.IsEnabled = True
    End Sub

    Private Sub TransButton_Click(sender As Object, e As RoutedEventArgs) Handles transButton.Click
        serport.Write(transTextBox.Text & vbCrLf)
        transTextBox.Clear()

    End Sub


    Private Sub serport_datareceived(sender As Object, e As SerialDataReceivedEventArgs) Handles serport.DataReceived
        'recTextBox.Text = receiveserialdata()

        'with serForm's function???
        ReceivedText(serport.ReadLine())
    End Sub

    Private Sub ReceivedText(ByVal [text] As String)
        If recTextBox.Dispatcher.CheckAccess() Then
            Dim x As New SetTextCallback(AddressOf ReceivedText)
            Dispatcher.Invoke(x, New Object() {(text)})

        Else
            recTextBox.Text &= [text]
        End If

    End Sub

    'Function receiveserialdata() As String
    '    ' receive strings from a serial port.
    '    Dim returnstr As String = ""
    '    Try
    '        Do
    '            Dim incoming As String = serport.ReadExisting()
    '            If incoming Is Nothing Then
    '                Exit Do
    '            Else
    '                returnstr &= incoming & vbCrLf
    '            End If
    '        Loop
    '    Catch ex As TimeoutException
    '        returnstr = "error: serial port read timed out."
    '    Finally
    '        If serport IsNot Nothing Then serport.Close()
    '    End Try

    '    Return returnstr
    'End Function

End Class

System.InvalidOperationException: 'The calling thread cannot access this object because a different thread owns it.'

标签: wpfvb.netserial-port

解决方案


推荐阅读