2016-10-05 70 views
-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同步?意味着如何使用此串口類完全在不同的線程上工作?

回答

0

我發現這個懸掛30-35秒是因爲真正的端口驅動。驅動程序本身需要30-35秒才能從路由器斷開連接。驅動程序將其狀態更改爲「重新連接...」之後,應用程序將按照正常方式釋放它的作業。