.Net Core中的ObjectPool
一、对象池
运用对象池化技术可以显著地提升性能,尤其是当对象的初始化过程代价较大或者频率较高。下面是ObjectPool源码中涉及的几个类。当你看过.Net Core源码很多时,你会发现,微软的开发很多都是这种模式,通过Policy构建Provider,通过Provider创建最终的类。

二、使用
这个组件的目的主要是将对象保存到对象池,用的时候直接去取,不需要重新创建,实现对象的重复利用。但是有个问题,假如对象池中开始没有对象或者取得数量大于对象池中的数量怎么办?在对象池中对象的数量不足时,此时来取对象,需要通过Policy创建对象,至于怎么创建对象,是你需要实现的。Policy如上图,有个默认实现 DefaultPooledObjectPolicy ,它的创建就是 new T().
DefaultObjectPool<User> defaultPool = new DefaultObjectPool<User>(new DefaultPooledObjectPolicy<User>(), );
var firstUser=defaultPool.Get();//从对象池中取一个对象,此时对象池中还没有对象,返回 Age=0 Name=null
var user1 = new User()
{
Age = ,
Name = "MicroHeart"
};
var user2 = new User()
{
Age = ,
Name = "MicroHeart"
};
var user3 = new User()
{
Age = ,
Name = "MicroHeart"
};
defaultPool.Return(user1);//将对象放回对象池中,但是不一定成功。对象池有数量限制,而且也可以自定义限制,让一些对象不能放入对象池中
defaultPool.Return(user2);
defaultPool.Return(user3);
var u1 = defaultPool.Get();//从对象池中取一个对象,返回第一个放入的user1
var u2 = defaultPool.Get();//从对象池中取一个对象,返回第二个放入的user2
var u3 = defaultPool.Get();//此时对象池中没有对象了,获取对象调用的Policy的Create方法,而DefaultPooledObjectPolicy的Create方法的实现是:new T(),所以返回 Age=0 Name=null
上面例子当对象池中没有对象是,调取获取方法,其实就是new T()。下面在对象中添加3个对象,但是对象池中只有2个空间,所以第三个是添加不进去的。
现在自己创建一个的Policy
public class MyUserPolicy : PooledObjectPolicy<User>//需要继承抽象类
{
public override User Create()
{
return new User()
{
Age = ,
Name = "MicroHeart"
};
} public override bool Return(User user)
{
if (user.Age == )
return false;
return true;
}
}
DefaultObjectPool<User> defaultPool = new DefaultObjectPool<User>(new MyUserPolicy(), );
var firstUser=defaultPool.Get();//返回 Age=0 Name=null
var user1 = new User()
{
Age = ,
Name = "MicroHeart"
};
var user2 = new User()
{
Age = ,
Name = "MicroHeart"
};
var user3 = new User()
{
Age = ,
Name = "MicroHeart"
};
defaultPool.Return(user1);
defaultPool.Return(user2);
defaultPool.Return(user3);
var u1 = defaultPool.Get();//返回user2 因为user1的Age=18,policy中Reture筛选条件 返回false,导致第一个user不能放入连接池中。
var u2 = defaultPool.Get();//返回user3
var u3 = defaultPool.Get();//返回 Age=18 Name=MicroHeart 这个是使用 Policy中的Create创建
三、源码解析
IPooledObjectPolicy<T>: 主要作用是创建对象和将对象放入连接池中
Create:定义一个创建对象的方法,当连接池中的数量不够取的时候,通过此方法创建对象。
Return:将对象放入连接池中,如果放入成功,返回Ture.否则返回False.
DefaultPooledObjectPolicy<T>:继承抽象类PooledObjectPolicy<T>,而抽抽象类继承接口 IPooledObjectPolicy<T>。Policy的默认实现类
Create:定义一个默认创建对象的方法 new T();
Return:不论是否放入连接池,全部返回True.
ObjectPoolProvider:创建对象池(ObjectPool)
abstract ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy):通过Policy创建ObjectPool
DefaultObjectPoolProvider:ObjectPoolProvider的默认实现类
ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy) :创建一个可以容纳处理器数量X2的对象池。
ObjectPool<T>:对象池
T Get():从对象池中获取对象。
void Return(T obj):将对象放入对象池中。
DefaultObjectPool:对象池的默认实现类,它实现了Get和Return方法。其实对象池的本质就是它的中的 ObjectWrapper[] _items; ,当使用Return方法是,将对象放入 ObjectWrapper数组中。Get方法从数组中取。

.Net Core中的ObjectPool的更多相关文章
- ASP.NET Core 中的 ObjectPool 对象重用(一)
前言 对象池是一种设计模式,一个对象池包含一组已经初始化过且可以使用的对象,而可以在有需求时创建和销毁对象.池的对象可以从池中取得对象,对其进行操作处理,并在不需要时归还给池子而非直接销毁他,他是一种 ...
- ASP.NET Core 中的 ObjectPool 对象重用(二)
前言 上一篇文章主要介绍了ObjectPool的理论知识,再来介绍一下Microsoft.Extensions.ObjectPool是如何实现的. 核心组件 ObjectPool ObjectPool ...
- .NET Core中Object Pool的简单使用
前言 复用,是一个重要的话题,也是我们日常开发中经常遇到的,不可避免的问题. 举个最为简单,大家最为熟悉的例子,数据库连接池,就是复用数据库连接. 那么复用的意义在那里呢? 简单来说就是减少不必要的资 ...
- .net core中的对象池
asp.net core中通过扩展库的方式提供给了一个标准的对象池ObjectPool,定义在Microsoft.Extensions.ObjectPool.dll 程序集中.它本身是个纯虚的抽象类, ...
- Asp.net core中的依赖注入
使用服务 在Asp.net core的Controller中,可以通过如下两种方式获取系统注入的服务: 构造函数 可以直接在构造函数中传入所依赖的服务,这是非常常见的DI注入方式. public Va ...
- 对象池在 .NET (Core)中的应用[2]: 设计篇
<编程篇>已经涉及到了对象池模型的大部分核心接口和类型.对象池模型其实是很简单的,不过其中有一些为了提升性能而刻意为之的实现细节倒是值得我们关注.总的来说,对象池模型由三个核心对象构成,它 ...
- .NET Core中的认证管理解析
.NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...
- ASP.NET Core 中的那些认证中间件及一些重要知识点
前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...
- Asp.net Core中使用Session
前言 2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Cor ...
随机推荐
- maven引入jar包冲突问题
1.原因 使用maven过程中,经常会遇到jar包重复加载或者jar包冲突的问题,但是有些jar包是由于maven加载了其他jar包自动引入的,并非自己主动添加的,导致和自己添加的jar包版本冲突 举 ...
- Vue2.x-社交网络程序项目的总结
最近几天一直在学习Vue的课程,通过这个项目进行进一步的学习Vue方面的知识.掌握如何使用Vue搭建前端,如何请求Node.js写好的后端接口. 一.实现前后端连载 首先在后端的文件中 vue i ...
- Net基础篇_学习笔记_第十二天_面向对象继承(父类和子类)
继承 我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员,单独的封装到一个类中,作为这些类的父类.Student.Teacher.Driver 子类 派生类Person ...
- jquery ajax到servlet出现中文乱码(utf-8编码下)
个人遇到的该问题有两大类: 第一类很普遍,就是jsp页面编码没有规定,servlet中接收参数没有转码,response没有使用setContentType()和setCharacterEncodin ...
- Hadoop&Hbase 双机热备--Pacemaker&DRBD部署
相关文章 DRBD的介绍请参考http://blog.csdn.net/rzhzhz/article/details/7103772 DRBD的部署请参考http://blog.csdn.ne ...
- win下的mongodb安装和基础操作
一.下载地址: https://www.mongodb.com/download-center/community 二.安装错误: 1.安装过程中报错(类似下图): 原因:没有管理员权限 解决:管理员 ...
- C# HTTP网络常用方法封装
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Regi ...
- C#加载前生成静态网页
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...
- 第一次接触WebSocket遇到的坑以及感受
要求用.net写一个服务,然后通过webscoket实现客户端与服务端之间的通信. 第一次知道.net还可以用来写服务,然后问题来了,服务是什么- -..下面图里的就是服务,可以停止暂停和启动. 我要 ...
- java.nio.ByteBuffer中的flip()、rewind()、compact()等方法的使用和区别
java.nio.ByteBuffer 1. ByteBuffer中的参数position.limit.capacity.mark含义: position:表示当前指针的位置(下一个要操作的数据元素的 ...