【发布时间】:2020-01-25 09:03:02
【问题描述】:
我们可以调用 ReadAsync() 并检查缓冲区中的读取字节...
PipeReader reader = ...;
ReadResult readResult = await reader.ReadAsync();
ReadOnlySequence<byte> buffer = readResult.Buffer;
long availableBytes = buffer.Length
如果在调用 ReadAsync 之前长度没有增加,这是否表明管道结束(没有更多字节要读取)?如果不是,那么检测“管道末端”的正确方法是什么?
我们可以像这样表示缓冲区中字节的消耗:
reader.AdvanceTo(count);
然后检查是否有任何未消耗的字节,或者未来提供字节的可能性(即生产者尚未发出信号,它已停止向管道添加新字节)
readResult.IsCompleted
但是,如果我在缓冲区中寻找一个(或多个)序列,并在使用它之前等待一个完整的序列,那么即使缓冲区包含所有可用字节并且生产者已发出信号,IsComplete 似乎仍为假完成。
谢谢。
【问题讨论】:
-
"没有更多字节要读取" != "管道结束";只有当管道知道底层输入是关闭时,它们才是相同的,即不再有数据永远到达