问题描述
我正在使用 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);
}