这期内容当中小编将会给大家带来有关如何在。网络核心中使用对象池,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
<强>前言强>
复用,是一个重要的话题,也是我们日常开发中经常遇到的,不可避免的问题。
举个最为简单,大家最为熟悉的例子,数据库连接池,就是复用数据库连接。
那么复用的意义在那里呢?
简单来说就是减少不必要的资源损耗。
除了数据库连接,可能在不同的情景或需求下,还会有很多其他对象需要进行复用,这个时候就会有所谓的对象池(对象池)。
小伙伴们应该也自己实现过类似的功能,或用ConcurrentBag,或用ConcurrentQueue,或用其他方案。
这也里分享一个在微软文档中的实现
如何:创建一个对象池使用ConcurrentBag
当然,在。网络核心中,微软已经帮我们实现了一个简单的对象池。
我们只需要添加Microsoft.Extensions.ObjectPool的引用即可使用了。
Microsoft.Extensions.ObjectPool
Microsoft.Extensions.ObjectPool可以说是。网络核心的一个基础类库。
它位于aspnet的常见的项目中,类型其他基础模块都有使用相关的功能,也好比路由项目。
下面就简单看看它的用法。
在开始之前,我们先定义一个可以复用的对象
public class 演示 { ,public int Id {组,得到,,,} ,public string Name {组,得到,,,} ,public DateTime CreateTimte {组,得到,,,} }
用法1
var defalutPolicy =, new DefaultPooledObjectPolicy();//最大可保留对象数量,=,Environment.ProcessorCount * 2 var defaultPool =, new DefaultObjectPool (defalutPolicy); for (int 小姐:=,0;,小姐:& lt;, PoolSize;,我+ +) {=,,item1  defaultPool.Get (); 美元,Console.WriteLine (“# {i + 1} - {item1.Id} - {item1.Name} - {item1.CreateTimte}“); }
在创建池之前,我们要先定义一个政策。这里直接用自带的DefaultPooledObjectPolicy来构造。
对象池会有一个维护的最大数量,线程数。
通过池对象的得到方法,从对象池中取出一个对象。
上面代码运行结果
# 1 - 0——01/01/0001就是
引用>
# 2 - 0——01/01/0001就是
# 3 - 0——01/01/0001就是
# 4 - 0——01/01/0001就是
# 5——01/01/0001就是
# 6 - 0——01/01/0001就是
# 7——01/01/0001就是
# 8——01/01/0001就是这个结果说明,对象池中的对象都是直接新出来的,并没有对一些属性进行贬值操作,这个时候往往没有太多实际意义。
因为<代码> DefaultPooledObjectPolicy 代码>本来就是直新接了一个对象出来,很多时候,这并不是我们所期望的!
要想符合我们实际的使用,就要自己定义一个政策!
<强>下面来看看用法2 强>
用法2
先定义一个政策,实现IPooledObjectPolicy这个接口.T很自然就是我们的演示类了。
public class DemoPooledObjectPolicy :, IPooledObjectPolicy{ ,public Demo Create () ,{ return 才能new Demo  {, Id =, 1, Name =,“catcher",, CreateTimte =, DateTime.Now }; ,} , ,public bool 返回(Demo obj) ,{ return 才能;真实; ,} } 这里要实现创建和返回两个方法。
见名知义,制造方法就是用来创建演示对象的,返回方法就是将演示对象扔回对象池的(有借有还)。
然后是用DemoPooledObjectPolicy去替换DefaultPooledObjectPolicy。
var demoPolicy =, new DemoPooledObjectPolicy (); var defaultPoolWithDemoPolicy =, new DefaultObjectPool(demoPolicy, 1);//借 时间=item1 defaultPoolWithDemoPolicy.Get ();//还 defaultPoolWithDemoPolicy.Return (item1);//借,但是不还 时间=item2 defaultPoolWithDemoPolicy.Get (); Console.WriteLine ($“{item1.Id} - {item1.Name} {item1.CreateTimte}“); Console.WriteLine ($“{item2.Id} - {item2.Name} {item2.CreateTimte}“); Console.WriteLine (item1 ==,第二条);//创建一个新的 时间=item3 defaultPoolWithDemoPolicy.Get (); Console.WriteLine ($“{item3.Id} - {item3.Name} {item3.CreateTimte}“); Console.WriteLine (item3 ==, item1); 这里定义了对象池只保留一个对象。
如何在。网络核心中使用对象池