我可以拥有一个带有多个读取器的 C# System.IO.Pipelines.Pipe 吗?

问题描述

我在 .NET 5 中使用 System.IO.Pipelines.Pipe 将数据从流传输到读取器,现在我想我想要几个独立的读取器来处理相同的数据流.是否有管道的变体可以让我拥有多个相同的读者?

或者,如果我做这样的事情,pipe2 是否会使用相同的段(即避免不必要的数据复制)?

Memory<byte> memory = pipe1.Writer.GetMemory(10240);
int receivedBytesCount = await stream.ReadAsync(memory,token);

pipe1.Writer.Advance(receivedBytesCount);

await pipe2.Writer.WriteAsync(memory);
pipe2.Writer.Advance(receivedBytesCount);

解决方法

不,管道不支持多个并发读取器。

您可以通过以下方式构建“T 形”管道:

  • 有一个“写入器”管道,可以从您的源读取并写入 Sequence
  • 序列将缓冲要由一组“读取器”管道读取的数据
  • 创建多个读取序列的“读取器”管道
  • 跟踪每个读者从序列中读取和刷新/释放处理过的数据的距离
  • 使用来自读取器的背压来限制缓冲到序列中的数据量。 (即不要在序列中缓冲比您需要的更多的数据)

这将是一项非常重要的工作,有很多地方会出错。例如:您可能需要在 Sequence 周围加锁,因为我不确定它是否支持并发读/写。