如果数据以 '\r' 结尾,StreamReader.ReadLineAsync() 将无限等待

问题描述

此问题主要供参考,也供其他有同样问题的朋友参考。不过,我很好奇是否有解决以下问题的好方法

问题

在使用 StreamReader.ReadLineAsync() 时,我注意到创建的 Task 永远不会完成。使用 Wireshark,我看到收到以下数据:

58 58 58 58 2c 2c 31 2c 33 2a 58 58 58 58 0d

相当于字符串

"XXXX,1,3*XXXX\r"

这是我想收到的正确消息。请注意,行尾只是 '\r'。 当检查 ReadLineAsync() 的 MSDN 文档时,没有提到如何定义行,即终止。 ReadLine() 的文档有我正在寻找的备注部分。所以该方法自动检测各种行尾:

  • \r
  • \n
  • \r\n

等一下...它如何检测以“\r”和“\r\n”结尾的行?我的意思是,如果 '\r' 字节已作为最后一个字节接收,则该方法必须等待下一个字节来检查它是否为 '\n'。啊,但是这是一个异步操作,所以它可以根据需要花费多长时间......当然,问题是,如果只收到这条线并且发送方不再发送,任务将永远不会结束数据直到做出响应。

查看 StreamReader 源代码(比较参考代码 here),看到以下行我并不感到惊讶:

if (ch == '\r' && (tmpCharPos < tmpCharLen || (await ReadBufferAsync().ConfigureAwait(false)) > 0))

很难说这是一个错误错误的实现还是不完整的文档。遗憾的是,StreamReader 类没有像 NewLine 那样的 StreamWriter 属性

我无法更改消息格式,因为行尾符合约定的规范。

问题

我错过了什么吗? 有替代品吗? 您更愿意从 StreamReader 派生并覆盖 ReadLineAsync() 方法还是完全使用不同的类?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)