私はSerialPortクラスイベントが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スレッド上でBeginInvokeをDataReceivedイベントとデリゲートを使用していましたアプリケーション(私はルータをオフに切り替えることを意味する)、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スレッドとの同期呼び出しを持っていると推測します。シリアルポートをUIスレッドと同期させないようにするソリューションはありますか?このシリアルポートクラスを使って、別のスレッドで完全に動作させる方法を教えてください。