我对管道的概念相当陌生,我喜欢实现一个客户端,它接收来自服务器的消息。服务器使用相当恒定的X秒延迟自动推送这些消息。我确实了解管道的基本知识及其使用--场景--还有一个关于Dev女士-博客的很好的教程。以下问题直接引用了本教程:我确信我可以使用一个管道和两个任务来处理从服务器发送的所有消息(直到连接关闭),但是在本教程中的循环中有两个语句,其中第二个语句混淆了我使用这两个任务处理所有消息的假设--我理解第一个条件。
int bytesRead = await socket.ReceiveAsync(memory, SocketFlags.None);
if (bytesRead == 0) { break; }但第二个完全让我困惑:
FlushResult result = await writer.FlushAsync();
if (result.IsCompleted) { break; }这里到底发生了什么?在哪些场景中result.IsCompleted是真实的?
发布于 2020-03-06 07:45:52
正如文档所说:
IsCompleted获得一个值,该值指示读取器不再读取写入PipeWriter的数据。
因此,这应该是一个测试,如果刷新和PipeReader.ReadAsync成功。
就像你的链接博客文章中所描述的那样:
当对PipeReader.ReadAsync()的调用返回时,我们得到一个包含两个重要信息的ReadResult,以ReadOnlySequence形式读取的数据和一个bool IsCompleted,它让读者知道作者是否完成了写作(EOF)。
PipeWriter的情况正好相反,而不是PipeReader。这似乎是必要的,因为它们并行运行。
https://stackoverflow.com/questions/60559476
复制相似问题