System.IO.Pipelines:接收连续消息

时间:2020-03-06 07:35:35

标签: c#

我对 Pipes 的概念还很陌生,并且我喜欢实现一个从服务器接收消息的客户端。服务器使用相当恒定的X秒延迟自动推送这些消息。我确实了解Pipes的基础知识及其使用场景-而且,MS Dev-Blog上有一个很棒的教程。以下问题直接涉及本教程:我很确定我可以使用一个管道,并且使用两个任务来处理从服务器发送的所有消息,直到连接关闭,但是有两个{{1} }语句在本教程的循环中,其中第二条语句使我对使用两个任务处理所有消息的假设感到困惑-我理解第一个条件

break

但是第二个完全让我感到困惑:

int bytesRead = await socket.ReceiveAsync(memory, SocketFlags.None);
if (bytesRead == 0) { break; }

这里到底发生了什么? FlushResult result = await writer.FlushAsync(); if (result.IsCompleted) { break; } 在哪种情况下是正确的?

1 个答案:

答案 0 :(得分:2)

documentation所示:
IsCompleted获得一个值,该值指示读取器不再读取写入PipeWriter的数据。

因此这应该是一次冲洗和PipeReader.ReadAsync是否成功的测试。

就像您的链接博客文章中所述:

当对PipeReader.ReadAsync()的调用返回时,我们将获得一个ReadResult,其中包含2条重要信息,即以ReadOnlySequence形式读取的数据和一个布尔IsCompleted,它使读者知道编写者是否完成写作(EOF)。

PipeWriter而不是PipeReader的另一种选择。由于它们并行运行,因此这似乎是必需的。