Проблема SerialPort.Write(String): синхронизированный вызов с UI-потоком
Я искал и выяснил, что у событий класса SerialPort есть вызов синхронизации с UI-потоком; Я использовал делегат с событием DataReceived для BeginInvoke в UI-потоке, ниже приведен мой код для события DataReceived,
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), потому что, когда я отключаю порт с приложением (то есть выключаю маршрутизатор), поток пользовательского интерфейса зависает. Для альтернативного решения я присвоил значение WriteTimeout 5000 (5 секунд) и перехватил исключение TimeoutException в блоке try и catch. Тем не менее 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-потоком, а это означает, как я могу использовать этот класс serialPort для полной работы в другом потоке?
1 ответ
Я понял, что это зависание на 30-35 секунд из-за драйвера реального порта. Сам драйвер занимает 30-35 секунд для отключения от роутера. После того, как драйвер меняет свой статус на "Переподключение...", приложение освобождает свое задание в обычном режиме.