.Net Core中ObjectPool的使用与源码解析
更新时间:2019年10月20日 09:16:24 作者:MicroHeart!
这篇文章主要给大家介绍了关于.Net Core中ObjectPool的使用与源码解析,文中通过示例代码介绍的非常详细,对大家的学习或者使用.Net Core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
一、对象池
运用对象池化技术可以显著地提升性能,尤其是当对象的初始化过程代价较大或者频率较高。下面是ObjectPool源码中涉及的几个类。当你看过.Net Core源码很多时,你会发现,微软的开发很多都是这种模式,通过Policy构建Provider,通过Provider创建最终的类。
二、使用
这个组件的目的主要是将对象保存到对象池,用的时候直接去取,不需要重新创建,实现对象的重复利用。但是有个问题,假如对象池中开始没有对象或者取得数量大于对象池中的数量怎么办?在对象池中对象的数量不足时,此时来取对象,需要通过Policy创建对象,至于怎么创建对象,是你需要实现的。Policy如上图,有个默认实现 DefaultPooledObjectPolicy ,它的创建就是 new T().
DefaultObjectPool<User> defaultPool = new DefaultObjectPool<User>(new DefaultPooledObjectPolicy<User>(), 2);
var firstUser=defaultPool.Get();//从对象池中取一个对象,此时对象池中还没有对象,返回 Age=0 Name=null
var user1 = new User()
{
Age = 18,
Name = “MicroHeart”
};
var user2 = new User()
{
Age = 19,
Name = “MicroHeart”
};
var user3 = new User()
{
Age = 20,
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 = 18,
Name = “MicroHeart”
};
}
public override bool Return(User user)
{
if (user.Age == 18)
return false;
return true;
}
}
DefaultObjectPool<User> defaultPool = new DefaultObjectPool<User>(new MyUserPolicy(), 2);
var firstUser=defaultPool.Get();//返回 Age=0 Name=null
var user1 = new User()
{
Age = 18,
Name = “MicroHeart”
};
var user2 = new User()
{
Age = 19,
Name = “MicroHeart”
};
var user3 = new User()
{
Age = 20,
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方法从数组中取。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对华域联盟的支持。
您可能感兴趣的文章:浅谈ASP.NET Core静态文件处理源码探究浅谈.Net Core 认证系统源码解析.NET Core源码解析配置文件及依赖注入详解ASP.NET Core MVC 源码学习:Routing 路由.NET Core单文件发布静态编译AOT CoreRT的方法详解.NET Core 源码编译的问题解析
.net
core
objectpool
相关文章
C#保存上传来的图片示例代码保存上传图片的方法有很多,在接下来的文章中为大家详细介绍下使用C#是如何做到的,感兴趣的朋友不要错过 2013-11-11
asp.net web大文件上传带进度条实例代码web 大文件上传 带进度条 2008-10-10
Asp.Net文本换行Asp.Net文本换行… 2007-04-04
DataGridView使用BindingNavigator实现简单分页功能这篇文章主要介绍了DataGridView使用BindingNavigator实现简单分页功能,本文主要是通过借用BindingNavigator空壳,文中通过实例代码讲解的非常详细,需要的朋友可以参考下 2019-11-11
Asp.net 文件上传类(取得文件后缀名,保存文件,加入文字水印)Asp.net 取得文件后缀名,保存文件,加入文字水印的代码类 2008-11-11
.NET Framework中定时器timer的单线程与多线程使用讲解这篇文章主要介绍了.NET Framework中定时器timer的单线程与多线程使用讲解,单线程定时器在性能方面不如多线程,但是可以做到线程安全,需要的朋友可以参考下 2016-04-04
在Asp.net用C#建立动态Excel在Asp.net用C#建立动态Excel… 2006-09-09
C#中的Equals、RefrenceEquals和==的区别与联系C#中判断两个对象是否相等有Equals、RefrenceEquals和==三种,其中==为运算符,其它两个为方法,而Equals又有两种版本,一个是静态的,一个是虚拟的,详细了解可以参考本文 2012-12-12
ASP.NET MVC5验证系列之服务端验证这篇文章主要为大家详细介绍了ASP.NET MVC5验证系列之服务端验证,使用两种方法来验证数据的合法性,手动验证的方式和数据注解来进行服务端验证,感兴趣的小伙伴们可以参考一下 2016-07-07
.NET Core实现分表分库、读写分离的通用 Repository功能这篇文章主要介绍了.NETCore 下支持分表分库、读写分离的通用 Repository,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2019-04-04
最新评论

评论(0)