【问题标题】:Can I have a C# System.IO.Pipelines.Pipe with multiple readers?我可以拥有一个具有多个阅读器的 C# System.IO.Pipelines.Pipe 吗?
【发布时间】:2021-05-06 01:21:01
【问题描述】:

我在 .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);

【问题讨论】:

    标签: c# .net system.io.pipelines


    【解决方案1】:

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

    您也许可以通过以下方式构建“Tee”管道:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 2018-11-05
      • 2011-01-27
      • 2012-05-27
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      相关资源
      最近更新 更多