数组是对托管堆中用于存储同类对象的一段连续内存的表达,而另一个类型Memory<T>则具有更加广泛的应用,因为它不仅仅可以表示一段连续的托管(Managed)内存,还可以表示一段连续的Native内存,甚至线程堆栈内存。具有如下定义的MemoryPool<T>表示针对Memory<T>类型的对象池。
public abstract class MemoryPool<T> : IDisposable { public abstract int MaxBufferSize { get; } public static MemoryPool<T> Shared { get; } public void Dispose(); protected abstract void Dispose(bool disposing); public abstract IMemoryOwner<T> Rent(int minBufferSize = -1); } public interface IMemoryOwner<T> : IDisposable { Memory<T> Memory { get; } }
MemoryPool<T>和ArrayPool<T>具有类似的定义,比如通过静态属性Shared获取当前应用全局共享的MemoryPool<T>对象,通过Rent方法从对象池中借出一个不小于指定大小的Memory<T>对象。不同的是,MemoryPool<T>的Rent方法并没有直接返回一个Memory<T>对象,而是一个封装了该对象的IMemoryOwner<T>对象。MemoryPool<T>也没有定义一个用来释放Memory<T>对象的Reurn方法,这个操作是通过IMemoryOwner<T>对象的Dispose方法完成的。如果采用MemoryPool<T>,前面针对ArrayPool<T>的演示实例可以改写成如下的形式。
class Program { static async Task Main() { using var fs = new FileStream("test.txt", FileMode.Open); var length = (int)fs.Length; using (var memoryOwner = MemoryPool<byte>.Shared.Rent(length)) { await fs.ReadAsync(memoryOwner.Memory); Console.WriteLine(Encoding.Default.GetString( memoryOwner.Memory.Span.Slice(0,length))); } } }
到此这篇关于.NET Core对象池的应用:扩展篇的文章就介绍到这了,更多相关.NET Core对象池的应用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章: