溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在.Net Core中使用ObjectPool

發(fā)布時(shí)間:2021-03-23 16:08:00 來源:億速云 閱讀:123 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章給大家介紹如何在.Net Core中使用ObjectPool,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

一、對(duì)象池  

運(yùn)用對(duì)象池化技術(shù)可以顯著地提升性能,尤其是當(dāng)對(duì)象的初始化過程代價(jià)較大或者頻率較高。下面是ObjectPool源碼中涉及的幾個(gè)類。當(dāng)你看過.Net Core源碼很多時(shí),你會(huì)發(fā)現(xiàn),微軟的開發(fā)很多都是這種模式,通過Policy構(gòu)建Provider,通過Provider創(chuàng)建最終的類。

如何在.Net Core中使用ObjectPool

二、使用

這個(gè)組件的目的主要是將對(duì)象保存到對(duì)象池,用的時(shí)候直接去取,不需要重新創(chuàng)建,實(shí)現(xiàn)對(duì)象的重復(fù)利用。但是有個(gè)問題,假如對(duì)象池中開始沒有對(duì)象或者取得數(shù)量大于對(duì)象池中的數(shù)量怎么辦?在對(duì)象池中對(duì)象的數(shù)量不足時(shí),此時(shí)來取對(duì)象,需要通過Policy創(chuàng)建對(duì)象,至于怎么創(chuàng)建對(duì)象,是你需要實(shí)現(xiàn)的。Policy如上圖,有個(gè)默認(rèn)實(shí)現(xiàn)  DefaultPooledObjectPolicy ,它的創(chuàng)建就是 new T().

DefaultObjectPool<User> defaultPool = new DefaultObjectPool<User>(new DefaultPooledObjectPolicy<User>(), 2);

   var firstUser=defaultPool.Get();//從對(duì)象池中取一個(gè)對(duì)象,此時(shí)對(duì)象池中還沒有對(duì)象,返回 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);//將對(duì)象放回對(duì)象池中,但是不一定成功。對(duì)象池有數(shù)量限制,而且也可以自定義限制,讓一些對(duì)象不能放入對(duì)象池中
   defaultPool.Return(user2);
   defaultPool.Return(user3);

   var u1 = defaultPool.Get();//從對(duì)象池中取一個(gè)對(duì)象,返回第一個(gè)放入的user1
   var u2 = defaultPool.Get();//從對(duì)象池中取一個(gè)對(duì)象,返回第二個(gè)放入的user2
   var u3 = defaultPool.Get();//此時(shí)對(duì)象池中沒有對(duì)象了,獲取對(duì)象調(diào)用的Policy的Create方法,而DefaultPooledObjectPolicy的Create方法的實(shí)現(xiàn)是:new T(),所以返回 Age=0 Name=null

上面例子當(dāng)對(duì)象池中沒有對(duì)象是,調(diào)取獲取方法,其實(shí)就是new T()。下面在對(duì)象中添加3個(gè)對(duì)象,但是對(duì)象池中只有2個(gè)空間,所以第三個(gè)是添加不進(jìn)去的。

現(xiàn)在自己創(chuàng)建一個(gè)的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 因?yàn)閡ser1的Age=18,policy中Reture篩選條件 返回false,導(dǎo)致第一個(gè)user不能放入連接池中。
   var u2 = defaultPool.Get();//返回user3
   var u3 = defaultPool.Get();//返回 Age=18 Name=MicroHeart 這個(gè)是使用 Policy中的Create創(chuàng)建

三、源碼解析

 IPooledObjectPolicy<T>:  主要作用是創(chuàng)建對(duì)象和將對(duì)象放入連接池中

  Create:定義一個(gè)創(chuàng)建對(duì)象的方法,當(dāng)連接池中的數(shù)量不夠取的時(shí)候,通過此方法創(chuàng)建對(duì)象。

  Return:將對(duì)象放入連接池中,如果放入成功,返回Ture.否則返回False.
  DefaultPooledObjectPolicy<T>:繼承抽象類PooledObjectPolicy<T>,而抽抽象類繼承接口 IPooledObjectPolicy<T>。Policy的默認(rèn)實(shí)現(xiàn)類

    Create:定義一個(gè)默認(rèn)創(chuàng)建對(duì)象的方法 new T();

    Return:不論是否放入連接池,全部返回True.

ObjectPoolProvider:創(chuàng)建對(duì)象池(ObjectPool)

  abstract ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy):通過Policy創(chuàng)建ObjectPool

  DefaultObjectPoolProvider:ObjectPoolProvider的默認(rèn)實(shí)現(xiàn)類

    ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy) :創(chuàng)建一個(gè)可以容納處理器數(shù)量X2的對(duì)象池。

ObjectPool<T>:對(duì)象池

  T Get():從對(duì)象池中獲取對(duì)象。

  void Return(T obj):將對(duì)象放入對(duì)象池中。

  DefaultObjectPool:對(duì)象池的默認(rèn)實(shí)現(xiàn)類,它實(shí)現(xiàn)了Get和Return方法。其實(shí)對(duì)象池的本質(zhì)就是它的中的 ObjectWrapper[] _items; ,當(dāng)使用Return方法是,將對(duì)象放入 ObjectWrapper數(shù)組中。Get方法從數(shù)組中取。

如何在.Net Core中使用ObjectPool

關(guān)于如何在.Net Core中使用ObjectPool就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI