wpf - 调用线程无法访问此对象 (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.'
解决方案
推荐阅读
- jwt - 如何通过 Cookie 撤销 JWT 身份验证?
- scala - Spark 中的循环分区如何工作?
- reactjs - 在 React Bootstrap 对话框中,如果对话框的主体内部有一个组件,如何引用组件及其状态?
- python - try-except 后“else”块的目的是什么?
- wordpress - Apache 子域重定向到 www 上的 WordPress
- javascript - 如何在 Facebook 等我的项目中创建和表情符号?
- python - 使用 python 读取 MYSQL Db 会返回一个元组,我需要将其转换为列表
- code-signing-certificate - 代码签名证书过期后,已经安装的应用程序会发生什么?
- arrays - 在非常大的数组中计算较小或相等元素的更快方法?
- c# - 如何在 C# 中像存储过程一样执行 Access 查询