SerialPort.BaseStream.ReadAsync()在不同情况下的行为如何?

时间:2019-03-15 11:44:55

标签: c# asynchronous io serial-port

我一直在试图了解SerialPort.BaseStream.ReadAsync(),但不幸的是,我找不到关于其行为的足够完整的描述。 假设已按以下方式调用它:

Task<int> reading = Serial.BaseStream.ReadAsync(Buffer, 0, Buffer.Length, cancellationToken);
reading.Wait();

现在,ReadAsync()在以下情况下会做什么?

  1. 内部缓冲区中有一些数据可供读取。
  2. 没有立即可用的数据,但是新数据在Serial.ReadTimeout间隔内到达。
  3. 没有立即可用的数据,并且没有新数据在Serial.ReadTimeout间隔内到达。例如,另一端的设备悄悄停止响应。
  4. cancelationToken已激活。
  5. 存在可检测到的硬件故障(例如,如果我们谈论的是USB串行连接,则拔出USB插头)。

据我了解:

    从内部缓冲区复制数据后,
  1. reading任务运行完成。 Wait()几乎立即返回。
  2. reading任务等待数据,然后在收到新数据后返回。到底是什么时候?在接收到最后一个字节之后已经超过ReadTimeout了吗?
  3. reading任务等待数据-再次等待多长时间?是否尊重Serial.ReadTimeout?如果无法接收任何数据会怎样? MSDN states是否报告说,如果在流的末尾调用它,则读取的字节数为0,但是这种情况是否算作SerialPort的流的末尾?
  4. reading任务进入取消状态。 Wait()抛出包含AggregateException的{​​{1}}。
  5. TaskCancelledException任务会进入故障状态,在这种情况下,reading会抛出Wait()吗?

0 个答案:

没有答案
相关问题