使用IMemoryOwner<char>时,如何处理部分填充缓冲区的返回问题?
问题解答
核心结论
.NET没有内置的直接解决方案,你需要自定义一个包装类型来处理切片后的IMemoryOwner<char>。
具体实现思路
- 自定义一个实现
IMemoryOwner<T>接口的包装类,内部持有原始的IMemoryOwner<T>实例和切片后的内存段:- 类的
Memory属性直接返回切片后的Memory<T>。 Dispose方法调用原始实例的Dispose,确保内存能正常归还到调用方的MemoryPool。
- 类的
示例代码
public sealed class SlicedMemoryOwner<T> : IMemoryOwner<T> { private readonly IMemoryOwner<T> _originalOwner; private readonly Memory<T> _slicedMemory; public SlicedMemoryOwner(IMemoryOwner<T> originalOwner, int start, int length) { _originalOwner = originalOwner ?? throw new ArgumentNullException(nameof(originalOwner)); _slicedMemory = originalOwner.Memory.Slice(start, length); } public Memory<T> Memory => _slicedMemory; public void Dispose() => _originalOwner.Dispose(); }
使用方式
在GetPagesAsync处理最后一次读取时,用这个包装类返回切片后的结果:
// 从内存池获取原始的IMemoryOwner<char> var originalOwner = memoryPool.Rent(bufferSize); // 读取数据到originalOwner.Memory,得到实际读取长度charactersRead return new SlicedMemoryOwner<char>(originalOwner, 0, charactersRead);
额外说明
不需要自行实现MemoryPool,.NET内置的MemoryPool<T>完全能满足需求。自定义包装类只是对原始IMemoryOwner<T>做一层切片封装,既保证了内存归还逻辑的正确性,又能返回解析器所需的IMemoryOwner<char>类型。
内容的提问来源于stack exchange,提问作者Giles
相关产品推荐
相关产品推荐

