Проблема 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 секунд для отключения от роутера. После того, как драйвер меняет свой статус на "Переподключение...", приложение освобождает свое задание в обычном режиме.

Другие вопросы по тегам