首页 > 解决方案 > ReadOnlySequence.GetPosition 返回错误的位置

问题描述

我正在使用 .NET Standard 2.1 Preview 8。我构建了一个小程序,基本上从 TcpSocket 写入/读取。阅读完成Pipe

鉴于以下实现

var pipe = new Pipe();

await pipe.Writer.WriteAsync(new ReadOnlyMemory<byte>(new byte[100]));
await pipe.Writer.FlushAsync();

while (true)
{
    var readResult = await pipe.Reader.ReadAsync();
    if (readResult.Buffer.Length <= 0)
        break;

    Console.WriteLine("Buffer length:" + readResult.Buffer.Length);
    Console.WriteLine("Buffer start:" + readResult.Buffer.Start.GetInteger());

    var position = readResult.Buffer.GetPosition(10);
    Console.WriteLine("End position:" + position.GetInteger());
    Console.WriteLine();

    pipe.Reader.AdvanceTo(position);
}

此方案将 100 个字节写入PipeWriter. 然后在循环中读取缓冲区,Reader 前进 10 个字节。

这会生成以下输出:

Buffer length:100
Buffer start:0
End position:10

Buffer length:90
Buffer start:10
End position:20

Buffer length:80
Buffer start:20
End position:30

Buffer length:70
Buffer start:30
End position:40

Buffer length:60
Buffer start:40
End position:50

Buffer length:50
Buffer start:50
End position:60

Buffer length:40
Buffer start:60
End position:70

Buffer length:30
Buffer start:70
End position:80

Buffer length:20
Buffer start:80
End position:90

Buffer length:10
Buffer start:90
End position:100

我不明白为什么缓冲区开始并且位置每次迭代都会增加 10。我希望在管道上读取之后,对于每次迭代,缓冲区开始为 0,当我获得偏移量为 10 的位置时,位置将为 10。每次迭代只有缓冲区大小应减少 10。

是否存在错误或以其他方式定义的位置?

标签: c#.net

解决方案


事实证明,这SequencePosition.GetInteger()是考虑供内部使用的。使用 a SequenceReader(如此处提议)对我有用。

由于SequenceReader标准中不可用,我填写了这个问题


推荐阅读