c#中常用类或组件的使用场景(归纳总结)

c#中常用的池对象及其使用场景

C# 中有多个池化对象,可以通过这些对象来管理和重用内存,减少不必要的内存分配和释放开销。以下是一些常见的池化对象:

  • ArrayPool:用于管理数组池的类,可以重复使用数组内存,避免频繁的内存分配和垃圾回收。场景:高性能网络应用程序数据包处理/异步临时缓冲/大量数组计算

  • ObjectPool:用于管理对象池的类,可以重复使用对象实例,避免频繁的对象创建和销毁。

  • MemoryPool:用于管理内存池的类,可以预先分配一定数量的内存块(内存块是一块连续的内存区域, 以byte数组的形式存在,可以用来存储各种类型的数据),并在需要时从池中获取这些内存块,以避免频繁的内存分配和释放, 可以管理任意类型的内存块,包括数组和对象等。

  • ConnectionPool:用于管理数据库连接池的类,可以重复使用数据库连接,避免频繁的数据库连接和断开操作。

  • ThreadPool:用于管理线程池的类,可以重复使用线程实例,避免频繁的线程创建和销毁。

// 数组池
var shared = ArrayPool<int>.Shared; 
var rentedArray = shared.Rent(10); // 租用
rentedArray[0] = 1;
shared.Return(rentedArray); // 归还

// 内存池 MemoryPool 则提供了更通用的 Allocate、Free 等方法,可以用于管理任意类型的内存块
var memoryPool = MemoryPool<int>.Shared;
var rentedArray = memoryPool.Rent(10); // 租用
rentedArray.Memory.Span[0] = 1;
memoryPool.Return(rentedArray); // 归还

注意: 归还对象池时, 需要重置对象状态(重写其 Reset 方法)以避免脏数据

总之,C# 中有多个池化对象可供使用,这些对象可以帮助我们管理和重用内存、对象、连接等资源,从而提高性能和效率。 在应用程序中选择合适的池化对象是非常重要的,可以根据应用程序的特点和需求来选择合适的对象来管理资源。

MemoryPool 与 MemoryStream 对比

MemoryStream 常作为其他流数据交换时的中间对象操作, MemoryStream类封装一个字节数组,在构造实例时可以使用一个字节数组作为参数,但是数组的长度无法调整。使用默认无参数构造函数创建实例,可以使用Write方法写入,随着字节数据的写入,数组的大小自动调整。

MemoryStream 是一个用于在内存中创建和操作流数据的类。它可以将内存看作是一个数据流,并提供了读取和写入数据的方法。它通常用于将数据从其他数据源(如文件或网络)加载到内存中,或者将数据从内存保存到其他目标(如文件或网络)。MemoryStream 使用一个可变大小的内部缓冲区来存储数据,并且可以动态增长以容纳更多的数据。

此处评论已关闭