如何在。网络核心中使用对象池

  介绍

这期内容当中小编将会给大家带来有关如何在。网络核心中使用对象池,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

<强>前言

复用,是一个重要的话题,也是我们日常开发中经常遇到的,不可避免的问题。

举个最为简单,大家最为熟悉的例子,数据库连接池,就是复用数据库连接。

那么复用的意义在那里呢?

简单来说就是减少不必要的资源损耗。

除了数据库连接,可能在不同的情景或需求下,还会有很多其他对象需要进行复用,这个时候就会有所谓的对象池(对象池)。

小伙伴们应该也自己实现过类似的功能,或用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);

这里定义了对象池只保留一个对象。

如何在。网络核心中使用对象池