91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在.Net Core中使用ObjectPool

發布時間:2021-03-23 16:08:00 來源:億速云 閱讀:133 作者:Leah 欄目:開發技術

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

一、對象池  

運用對象池化技術可以顯著地提升性能,尤其是當對象的初始化過程代價較大或者頻率較高。下面是ObjectPool源碼中涉及的幾個類。當你看過.Net Core源碼很多時,你會發現,微軟的開發很多都是這種模式,通過Policy構建Provider,通過Provider創建最終的類。

如何在.Net Core中使用ObjectPool

二、使用

這個組件的目的主要是將對象保存到對象池,用的時候直接去取,不需要重新創建,實現對象的重復利用。但是有個問題,假如對象池中開始沒有對象或者取得數量大于對象池中的數量怎么辦?在對象池中對象的數量不足時,此時來取對象,需要通過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方法從數組中取。

如何在.Net Core中使用ObjectPool

關于如何在.Net Core中使用ObjectPool就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广西| 江华| 大竹县| 丰台区| 六安市| 巢湖市| 南乐县| 松阳县| 景宁| 惠安县| 苏尼特右旗| 梁河县| 岳西县| 襄垣县| 仲巴县| 浦东新区| 馆陶县| 松江区| 麻城市| 枝江市| 沾益县| 谢通门县| 东丽区| 道真| 金昌市| 东乌珠穆沁旗| 东阿县| 高唐县| 五莲县| 东丰县| 行唐县| 高陵县| 蕉岭县| 黑龙江省| 玉龙| 栾川县| 体育| 化州市| 河西区| 雷州市| 丰宁|