Вызывающий поток не может получить доступ к этому объекту (Dispatcher.CheckAccess) - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь использовать последовательную связь в WPF с vb.net, и единственная успешная вещь, которую я могу сделать, это отправка данных.Когда дело доходит до получения данных, я получаю разные ошибки, и с этой труднее всего мне покончить.Я пытался применить код формы Windows, когда мы хотим получать данные с помощью Control.InvokeRequired, но, поскольку это 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.'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...