问题描述
此问题主要供参考,也供其他有同样问题的朋友参考。不过,我很好奇是否有解决以下问题的好方法。
问题
在使用 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 (将#修改为@)