1

我在 .NET 5 中使用System.IO.Pipelines.Pipe将数据从流传输到读取器,现在我想我想要几个独立的读取器来处理相同的数据流。是否有一个 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);

4

1 回答 1

1

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

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

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

这将是一项不平凡的工作,有很多地方会出错。例如:您可能需要在序列周围放置一个锁,因为我不确定它是否支持并发读/写。

于 2021-02-01T21:09:17.977 回答