Зачем .NET SerialPort ReadByte () блокировать полный тайм-аут, если данные поступают после того, как они вызваны - PullRequest
0 голосов
/ 04 февраля 2019

Работая в Windows 10 с .NET 4.7.2 и виртуальными последовательными портами, у меня есть обработчик SerialPort DataReceived, который выглядит следующим образом:

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    _serialPort.ReadTimeout = 10000;
    while (true)
    {
        try
        {
            var nextByte = _serialPort.ReadByte();
            Debug.WriteLine(((byte)nextByte).ToString("X2"));
            continue;
        }
        catch (TimeoutException)
        {
        }

        break;
    }
}

Если я записываю байт в порт, то онсразу появляется в окне отладки, и из-за цикла while и continue снова вызывается ReadByte(), где он блокируется до истечения 10-секундного тайм-аута.Если я запишу больше данных в порт за это время, ReadByte() не вернется немедленно.Вместо этого он продолжает блокироваться до тех пор, пока не истечет полный тайм-аут, и только затем возвращает вновь записанный байт.

Почему бы не вернуться, как только появятся новые данные?

...