Vb.net SerialPort.Write(字符串)问题:与UI线程进行同步调用
我搜索并发现SerialPort类事件具有与UI线程的同步调用,因此;我已经使用带有DataReceived事件的委托在UI线程上启动InVoke,下面是我的DataReceived事件代码Vb.net SerialPort.Write(字符串)问题:与UI线程进行同步调用,vb.net,serial-port,ui-thread,begininvoke,timeoutexception,Vb.net,Serial Port,Ui Thread,Begininvoke,Timeoutexception,我搜索并发现SerialPort类事件具有与UI线程的同步调用,因此;我已经使用带有DataReceived事件的委托在UI线程上启动InVoke,下面是我的DataReceived事件代码 Delegate Sub DataRXPointer(ByVal Buffer As String) '########### Data Receive Handler ########### Private Sub COMPort_DataReceivedHandler(sender As Object
Delegate Sub DataRXPointer(ByVal Buffer As String)
'########### Data Receive Handler ###########
Private Sub COMPort_DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs) Handles COMPort.DataReceived
Me.BeginInvoke(New DataRXPointer(AddressOf handleDataRX), COMPort.ReadExisting)
End Sub
但是SerialPort.Write(String)方法中存在一个问题,因为当我断开端口与应用程序的连接(意味着我关闭路由器)时,UI线程挂起。对于另一种解决方案,我已将WriteTimeout值指定为5000(5秒),并在try-and-catch块中捕获TimeoutException。UI线程仍然挂起约25-30秒,然后发生异常,我处理并关闭端口
WriteTimeout = 5000 '// 5-sec
ReadTimeout = 5000 '// 5-sec
Try
If COMPort.IsOpen Then
COMPort.Write(dataToSend)
End If
Catch ex As TimeoutException
If COMPort IsNot Nothing Then
COMPort.Dispose()
COMPort.Close()
End If
Me.Close()
End Try
因为它的挂起时间大约为25-30秒,所以我假设这个方法也有一个与UI线程的同步调用。是否有任何解决方案不将serialPort与UI线程同步意味着如何使用此serialPort类在另一个线程上完全工作?我发现挂起30-35秒是因为真正的端口驱动程序。驱动程序本身需要30-35秒来断开与路由器的连接。驱动程序将其状态更改为“重新连接…”后,应用程序将按照正常方式释放其作业