Я пытался понять SerialPort.BaseStream.ReadAsync()
, и, к сожалению, я не могу найти достаточно полное описание его поведения.Предположим, что он был вызван следующим образом:
Task<int> reading = Serial.BaseStream.ReadAsync(Buffer, 0, Buffer.Length, cancellationToken);
reading.Wait();
Что теперь будет делать ReadAsync()
в следующих ситуациях?
- Во внутреннем буфере доступны некоторые данныедля чтения.
- Нет доступных данных, но новые данные поступают в интервале
Serial.ReadTimeout
. - Нет доступных данных, и новые данные не поступают в интервале
Serial.ReadTimeout
.Например, устройство на другом конце тихо перестало отвечать. - Параметр cancellationToken активирован.
- Произошла обнаружимая аппаратная ошибка (скажем, если мы говорим о serial-over-usb,USB-плагин отключен).
Насколько я понимаю:
reading
задача выполняется до конца, после копирования данных из внутреннего буфера.Wait()
возвращается почти сразу. reading
задача ожидает данных, затем возвращается после получения новых данных.Что именно когда?После того, как прошло более 1030 * после последнего полученного байта? reading
задача ожидает данных - опять же, как долго?Это уважает Serial.ReadTimeout
?Что происходит, когда не удается получить какие-либо данные?MSDN заявляет , что сообщает о прочтении 0 байтов, если он вызывается в конце потока, но считается ли эта ситуация концом потока для SerialPort
? reading
задание переходит в отмененное состояние.Wait()
выбрасывает AggregateException
, содержащий TaskCancelledException
. - Будет ли задача
reading
переходить в состояние отказа, и в этом случае Wait()
выдает AggregateException
?