迭代 ReadOnlySequence 的 ReadOnlySequenceSegment 并返回到 ArrayPool

问题描述

我正在使用 ReadOnlySequence<byte> 将离散的 ReadOnlySequenceSegment<byte> 组合在一起,并且我有我对序列段的具体实现:

class Chunk<T> : ReadOnlySequenceSegment<T>
{
    public Chunk(ReadOnlyMemory<T> memory)
    {
        Memory = memory;
    }
    public Chunk<T> Add(ReadOnlyMemory<T> mem)
    {
        var segment = new Chunk<T>(mem)
        {
            RunningIndex = RunningIndex + Memory.Length
        };

        Next = segment;
        return segment;
    }
}

并向ReadOnlySequence<byte>写入一些链接的块:

var pool = ArrayPool<byte>.Shared;
var data1 = pool.Rent(2); // and memcopy in { 10,11 }
var data2 = pool.Rent(3); // and memcopy in { 0,1,2}
var data3 = pool.Rent(5); // and memcopy in { 0,100,120,210,255 }
/* snip memcopys */

var startChnk = new Chunk<byte>(new ReadOnlyMemory<byte>(data1));
var currentChnk = startChnk;
currentChnk = currentChnk.Add(new ReadOnlyMemory<byte>(data2));
currentChnk  = currentChnk.Add(new ReadOnlyMemory<byte>(data3));
var seq = new ReadOnlySequence<byte>(startChnk,currentChnk,currentChnk.Memory.Length);

我计划使用 ArrayPool<byte>.Shared 并从中租用和返回缓冲区,完成后我需要遍历 ReadOnlySequence 的块,将每个块返回到池中。

我遍历下面,但无法获得我可以返回的实际数组 - 我不能调用 ToArray() 因为它会复制 - 我需要底层内存但不能,因为这些设计是只读结构包装底层数组。

如何遍历我的 ReadOnlySequence 以便将单个 ReadOnlySequenceSegment 处理回 ArrayPool?

foreach(var chunk in seq)
{
    // I don't kNow how to get the array byte[] top return to the pool
    pool.Return(chunk.????);
}

解决方法

您可以使用以下内容:

if (MemoryMarshal.TryGetArray(chunk,out var segment))
{
    ArrayPool<byte>.Shared.Return(segment.Array);
}