-1
我已經搜索並發現SerialPort類事件與UI線程有同步調用,因此;我已經使用了與代表DataReceived事件檢索到的BeginInvoke在UI線程,下面是我的DataReceived事件檢索代碼,SerialPort.Write(String)問題:使用UI線程進行同步調用
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和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-Thread的同步調用。有什麼解決方案不要將serialPort與UI-Thread同步?意味着如何使用此串口類完全在不同的線程上工作?