asp.net core中通过扩展库的方式提供给了一个标准的对象池ObjectPool,定义在Microsoft.Extensions.ObjectPool.dll 程序集中。它本身是个纯虚的抽象类,它就定义了两个接口函数,实现如下

public abstract class ObjectPool<T> where T : class
{
    public abstract T Get();
    public abstract void Return(T obj);
}

这是一个比较典型的对象池接口:

  • Get函数用于从对象池获取对象,如果对象池没有可用对象,则会新建
  • Return函数用于对象使用完成后,将对象放回对象池,如果对象池容量已满,则交由系统GC回收。

由于抽象类ObjectPool无法直接使用,虽然接口实现并不复杂,但实现起来还是要花一番功夫的。因此,该库也还提供了一个默认实现DefaultObjectPool,如下就是一个简单的示例:

public class Program
{
public static void Main(string[] args)
{
var policy = new DefaultPooledObjectPolicy<TestData>();
var pool = new DefaultObjectPool<TestData>(policy, ); var obj = pool.Get();
pool.Return(obj); var obj2 = pool.Get();
Console.WriteLine(obj.Equals(obj2));
}
} class TestData
{
public string Id { get; set; }
public string Name { get; set; }
public int Value { get; set; }
}

DefaultObjectPool是一个默认的实现,它是线程安全的,我们可以放心在多线程环境下使用。它有两个输入参数:对象池策略IPooledObjectPolicy和线程池容量。

对象池策略IPooledObjectPolicy接口定义如下:

public interface IPooledObjectPolicy<T>
{
T Create();
bool Return(T obj);
}

它声明了对象的创建和释放的行为。接口看起来和线程池的接口非常相似,这样设计的好处有:

  • IPooledObjectPolicy负责对象创建和释放这种多变的行为,更加灵活,容易扩展
  • IPooledObjectPolicy只需要考虑的创建和释放即可,实现起来比较简单。线程安全,对象管理、维护都交由DefaultObjectPool来维护即可。

系统默认也有一个IPooledObjectPolicy的实现DefaultPooledObjectPolicy,它的实现如下:

public class DefaultPooledObjectPolicy<T> : PooledObjectPolicy<T> where T : class, new()
{
public override T Create()
{
return new T();
}
public override bool Return(T obj)
{
return true;
}
}

非常简单,并且大多数的时候也够用。当然,我们也可以根据需要实现自己的IPooledObjectPolicy。甚至也可以扩展DefaultObjectPool来实现自己的线程池。

.net core中的对象池的更多相关文章

  1. Java中的对象池技术

    java中的对象池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间.对象池其实也就是一个内存 ...

  2. Unity编程标准导引-3.4 Unity中的对象池

    本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的对象池 本节通过一个简单的射击子弹的示例来介绍T ...

  3. Java 中的对象池实现

    点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. 最近在 ...

  4. 关于tomcat中Servlet对象池

    Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端 ...

  5. GameObjectPool——Unity中的对象池

    这里介绍一种对象池的写法.它的优点在于无论取出还是插入游戏物体都是常数量时间. using UnityEngine; using System.Collections; using System.Co ...

  6. Egret中的对象池ObjectPool

    为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...

  7. Egret中的对象池Pool

    为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 一 对象池A 二 对象池B 一 对象池A 1. 支持传入构造函数 2. 支持预先创建对象 3. 支持统一执行函数 /** * ...

  8. ASP.NET Core 中的对象映射之 AutoMapper

    目录 AutoMapper 简介 AutoMapper 使用 初始化 Profile设置 扁平化映射 集合映射 投影 条件映射 值转换 设置转换前后行为 配置验证及设置 反向映射 自定义转换器 自定义 ...

  9. 对象池在 .NET (Core)中的应用[2]: 设计篇

    <编程篇>已经涉及到了对象池模型的大部分核心接口和类型.对象池模型其实是很简单的,不过其中有一些为了提升性能而刻意为之的实现细节倒是值得我们关注.总的来说,对象池模型由三个核心对象构成,它 ...

随机推荐

  1. python全栈开发day68-ORM操作:一般操作、ForeignKey操作、ManyToManyField、聚合查询和分组查询、F查询和Q查询等

    ORM操作 https://www.cnblogs.com/maple-shaw/articles/9403501.html 一.一般操作 1. 必知必会13条 <1> all(): 查询 ...

  2. 51Nod1634 刚体图 动态规划 容斥原理 排列组合

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1634.html 题目传送门 - 51Nod1634 题意 基准时间限制:1 秒 空间限制:13107 ...

  3. 015 OS模块

    这个部分,也不是很难,就懒得写程序了,粘贴了一个不错的连接. 1.说明 os模块提供了多数操作系统的功能接口函数. 当os模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作,在 ...

  4. day9文件操作---从即日起时景丽阳老师给我们讲课

    今天的主要内容是文件的操作,读,写,只读只写,或者可读同时可写,追加写,以二进制的方式读,以二进制的方式写,以二进制的方式追加. 思维导图: 给你一个文件路径,从中找出所有的文件,方法如下: # 方法 ...

  5. CodeForces 371C Hamburgers(经典)【二分答案】

    <题目链接> 题目大意: 给以一段字符串,其中只包含"BSC"这三个字符,现在有一定量免费的'B','S','C‘,然后如果想再买这三个字符,就要付出相应的价格.现在总 ...

  6. Apache系列:Centos7.2下安装与配置apache

    Centos7.2下安装与配置apache(一) 配置机:腾讯云服务器,centos7.2 一.安装Apache服务(Apache软件安装包叫httpd) yum install httpd -y 二 ...

  7. typescript精简版1:用ts表示常见数据类型

    一:工程准备: 1.全局安装typescript npm i typescript -g // 或 yarn global add typescript vscode 配置 在命令行执行 tsc -- ...

  8. EF Core中的多对多映射如何实现?

    EF 6.X中的多对多映射是直接使用HasMany-HasMany来做的.但是到了EF Core中,不再直接支持这种方式了,可以是可以使用,但是不推荐,具体使用可以参考<你必须掌握的Entity ...

  9. Win userAccountControl 基本属性

    userAccountControl 基本属性 属性标志 十六进制 十进制 说明 SCRIPT 0x0001 1 运行登录脚本 ACCOUNTDISABLE 0x0002 2 账户禁用 HOMEDIR ...

  10. react编码规范

    1.每个文件只写一个组件,但是多个无状态组件可以放在单个文件中: 2.有内部状态,方法或要对外暴露ref的组件,用类式组件: 3.无内部状态,方法或无需对外暴露ref的组件,用函数式组件: 4.有内部 ...