<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        .NET Core中Object Pool的多種用法詳解

        來源:懂視網 責編:小采 時間:2020-11-27 22:34:55
        文檔

        .NET Core中Object Pool的多種用法詳解

        .NET Core中Object Pool的多種用法詳解:前言 復用,是一個重要的話題,也是我們日常開發中經常遇到的,不可避免的問題。 舉個最為簡單,大家最為熟悉的例子,數據庫連接池,就是復用數據庫連接。 那么復用的意義在那里呢? 簡單來說就是減少不必要的資源損耗。 除了數據庫連接,可能在不同的情景或
        推薦度:
        導讀.NET Core中Object Pool的多種用法詳解:前言 復用,是一個重要的話題,也是我們日常開發中經常遇到的,不可避免的問題。 舉個最為簡單,大家最為熟悉的例子,數據庫連接池,就是復用數據庫連接。 那么復用的意義在那里呢? 簡單來說就是減少不必要的資源損耗。 除了數據庫連接,可能在不同的情景或

        這個結果說明,Object Pool 中的對象都是直接new出來的,并沒有對一些屬性進行貶值操作,這個時候往往沒有太多實際意義。

        因為DefaultPooledObjectPolicy本來就是直接new了一個對象出來,很多時候,這并不是我們所期望的!

        要想符合我們實際的使用,就要自己定義一個Policy!

        下面來看看用法2

        用法2

        先定義一個Policy,實現 IPooledObjectPolicy 這個接口。T很自然就是我們的Demo類了。

        public class DemoPooledObjectPolicy : IPooledObjectPolicy<Demo>
        {
         public Demo Create()
         {
         return new Demo { Id = 1, Name = "catcher", CreateTimte = DateTime.Now };
         }
         
         public bool Return(Demo obj)
         {
         return true;
         }
        }

        這里要實現Create和Return兩個方法。

        見名知義,Create方法就是用來創建Demo對象的,Return方法就是將Demo對象扔回Object Pool的(有借有還)。

        然后是用DemoPooledObjectPolicy去替換DefaultPooledObjectPolicy。

        var demoPolicy = new DemoPooledObjectPolicy();
        var defaultPoolWithDemoPolicy = new DefaultObjectPool<Demo>(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 == item2);
        //創建一個新的
        item3 = defaultPoolWithDemoPolicy.Get();
        Console.WriteLine($"{item3.Id}-{item3.Name}-{item3.CreateTimte}");
        Console.WriteLine(item3 == item1);

        這里定義了對象池只保留一個對象。

        由于從object pool中取出來之后,有一步還回去的操作,所以item1和item2應當是同一個對象。

        從object pool中拿出了item2之后,它并沒有還回去,所以object pool會基于我們定義的Policy去創建一個新的對象出來。

        下面是用法2的輸出結果:

        1-catcher-09/17/2018 22:32:38
        1-catcher-09/17/2018 22:32:38
        True
        1-catcher-09/17/2018 22:32:38
        False

        可以看到item1,item2和item3的各個屬性是一樣的,并且item1和item2確實是同一個對象。item3和item1并不是同一個。

        用法3

        除了DefaultObjectPool外,還有DefaultObjectPoolProvider也可以創建一個Object Pool。

        創建一個Object Pool,一定是離不開Policy的,所以這里還是用了我們自己定義的DemoPooledObjectPolicy。

        var defaultProvider = new DefaultObjectPoolProvider();
        var policy = new DemoPooledObjectPolicy();
        //default maximumRetained is Environment.ProcessorCount * 2
        ObjectPool<Demo> pool = defaultProvider.Create(policy);
        item1 = pool.Get();
        pool.Return(item1);
        item2 = pool.Get();
        Console.WriteLine($"{item1.Id}-{item1.Name}-{item1.CreateTimte}");
        Console.WriteLine($"{item2.Id}-{item2.Name}-{item2.CreateTimte}");
        Console.WriteLine(item1 == item2);
        item3 = pool.Get();
        Console.WriteLine($"{item3.Id}-{item3.Name}-{item3.CreateTimte}");
        Console.WriteLine(item3 == item2);

        用Provider創建Object Pool時,不能指定保留的最大對象數量,只能用的是默認的Environment.ProcessorCount * 2。

        后面的使用,和用法2是一樣的。

        可以看到item1和item2是同一個對象。從Object Pool中取對象的時候,會取第一個,所以還回去后,再取的話,還是會取到原來的第一個。

        item3那里是直接從Object Pool中取出來的,沒有再次創建,因為這里的Object Pool維護著多個對象,而不是用法2中的只有一個,所以它是直接從Pool中拿的。

        下面是輸出結果

        1-catcher-09/17/2018 22:38:34
        1-catcher-09/17/2018 22:38:34
        True
        1-catcher-09/17/2018 22:38:34
        False

        和用法2,本質是一樣的。

        用法4

        好像上面的用法,都不那么像我們正常使用的。我們還是需要依賴注入的。

        那么我們最后就來看看怎么結合依賴注入吧。當然這里的本質還是離不開Policy和Provider這兩個東西。

        IServiceCollection services = new ServiceCollection();
        services.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();
        services.AddSingleton(s =>
        {
         var provider = s.GetRequiredService<ObjectPoolProvider>();
         return provider.Create(new DemoPooledObjectPolicy());
        });
        ServiceProvider serviceProvider = services.BuildServiceProvider();
        var pool = serviceProvider.GetService<ObjectPool<Demo>>();
        item1 = pool.Get();
        pool.Return(item1);
        item2 = pool.Get();
        Console.WriteLine($"{item1.Id}-{item1.Name}-{item1.CreateTimte}");
        Console.WriteLine($"{item2.Id}-{item2.Name}-{item2.CreateTimte}");
        Console.WriteLine(item1 == item2);
        item3 = pool.Get();
        Console.WriteLine($"{item3.Id}-{item3.Name}-{item3.CreateTimte}");
        Console.WriteLine(item3 == item2);

        我們首先需要完成對Provider的注冊,然后直接拿它的實例去創建一個Object Pool即可。

        如果想在其他地方用,通過構造函數注入即可。

        這里的結果也是和前面一樣的,沒什么好多說的。

        總結

        在這幾種用法中,我們最常用的應該是用法4。

        但是無論那種用法,我們都需要了解,Object Pool離不開Pool,Policy和Provider這三個家伙。

        有了這三個,或許我們就可以為所欲為了。

        當然,它還提供了幾個特殊的東西,有興趣的可以去看看。

        •LeakTrackingObjectPool

        •StringBuilderPooledObjectPolicy

        最后用一個腦圖結束本文。

        以上所述是小編給大家介紹的.NET Core中Object Pool的多種用法詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        .NET Core中Object Pool的多種用法詳解

        .NET Core中Object Pool的多種用法詳解:前言 復用,是一個重要的話題,也是我們日常開發中經常遇到的,不可避免的問題。 舉個最為簡單,大家最為熟悉的例子,數據庫連接池,就是復用數據庫連接。 那么復用的意義在那里呢? 簡單來說就是減少不必要的資源損耗。 除了數據庫連接,可能在不同的情景或
        推薦度:
        標簽: 使用 的使用 co
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产精品13p| 成人毛片免费视频| 午夜亚洲福利在线老司机| 亚洲欧洲在线播放| 免费A级毛片无码专区| 亚洲国产精品一区二区第一页| 深夜免费在线视频| 一本久久综合亚洲鲁鲁五月天| 亚洲精品无码av片| 成年大片免费视频| 亚洲日本VA午夜在线电影| 无限动漫网在线观看免费| 亚洲a级在线观看| 免费H网站在线观看的| 亚洲乱码一区av春药高潮| 精品国产污污免费网站aⅴ | 九九热久久免费视频| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 一级毛片试看60分钟免费播放| 国产精品无码一二区免费| 在线播放亚洲精品| 久久乐国产精品亚洲综合| 国产精品九九久久免费视频| 中文字幕亚洲综合久久菠萝蜜| 中文字幕免费在线看线人动作大片 | 国产亚洲精品自在久久| 大地资源在线资源免费观看| 亚洲AV综合色区无码一区爱AV | 亚洲国产精品无码第一区二区三区 | 免费不卡在线观看AV| 亚洲中字慕日产2021| 毛片a级毛片免费播放下载| 亚洲av无码成人精品区一本二本 | 亚洲综合久久精品无码色欲| 国内一级一级毛片a免费| 边摸边吃奶边做爽免费视频网站 | 大妹子影视剧在线观看全集免费 | 亚洲性无码av在线| 午夜一区二区免费视频| 黄色网址在线免费观看| 久久99国产亚洲精品观看|