真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何在.NETCore中使用ObjectPool-創(chuàng)新互聯(lián)

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)如何在.NET Core中使用Object Pool,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

在廬陽等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都網(wǎng)站建設、網(wǎng)站設計 網(wǎng)站設計制作定制網(wǎng)站開發(fā),公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,品牌網(wǎng)站制作,成都全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站建設公司,廬陽網(wǎng)站建設費用合理。

前言

復用,是一個重要的話題,也是我們?nèi)粘i_發(fā)中經(jīng)常遇到的,不可避免的問題。

舉個最為簡單,大家最為熟悉的例子,數(shù)據(jù)庫連接池,就是復用數(shù)據(jù)庫連接。

那么復用的意義在那里呢?

簡單來說就是減少不必要的資源損耗。

除了數(shù)據(jù)庫連接,可能在不同的情景或需求下,還會有很多其他對象需要進行復用,這個時候就會有所謂的 Object Pool(對象池)。

小伙伴們應該也自己實現(xiàn)過類似的功能,或用ConcurrentBag,或用ConcurrentQueue,或用其他方案。

這也里分享一個在微軟文檔中的實現(xiàn)

How to: Create an Object Pool by Using a ConcurrentBag

當然,在.NET Core中,微軟已經(jīng)幫我們實現(xiàn)了一個簡單的Object Pool。

我們只需要添加Microsoft.Extensions.ObjectPool的引用即可使用了。

Microsoft.Extensions.ObjectPool

Microsoft.Extensions.ObjectPool可以說是.NET Core的一個基礎類庫。

它位于aspnet的Common項目中,類型其他基礎模塊都有使用相關(guān)的功能,也好比Routing項目。

下面就簡單看看它的用法。

在開始之前,我們先定義一個可以復用的object

public class Demo
{
 public int Id { get; set; }
 public string Name { get; set; }
 public DateTime CreateTimte { get; set; }
}

用法1

var defalutPolicy = new DefaultPooledObjectPolicy();
//較大可保留對象數(shù)量 = Environment.ProcessorCount * 2
var defaultPool = new DefaultObjectPool(defalutPolicy);
for (int i = 0; i < PoolSize; i++)
{
 item1 = defaultPool.Get();
 Console.WriteLine($"#{i+1}-{item1.Id}-{item1.Name}-{item1.CreateTimte}");
}

在創(chuàng)建pool之前,我們要先定義一個Policy。這里直接用自帶的DefaultPooledObjectPolicy來構(gòu)造。

對象池會有一個維護的較大數(shù)量,線程數(shù)。

通過pool對象的Get方法,從對象池中取出一個對象。

上面代碼運行結(jié)果

#1-0--01/01/0001 00:00:00
#2-0--01/01/0001 00:00:00
#3-0--01/01/0001 00:00:00
#4-0--01/01/0001 00:00:00
#5-0--01/01/0001 00:00:00
#6-0--01/01/0001 00:00:00
#7-0--01/01/0001 00:00:00
#8-0--01/01/0001 00:00:00

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

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

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

下面來看看用法2

用法2

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

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

這里要實現(xiàn)Create和Return兩個方法。

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

然后是用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 == item2);
//創(chuàng)建一個新的
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去創(chuàng)建一個新的對象出來。

下面是用法2的輸出結(jié)果:

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也可以創(chuàng)建一個Object Pool。

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

var defaultProvider = new DefaultObjectPoolProvider();
var policy = new DemoPooledObjectPolicy();
//default maximumRetained is Environment.ProcessorCount * 2
ObjectPool 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創(chuàng)建Object Pool時,不能指定保留的較大對象數(shù)量,只能用的是默認的Environment.ProcessorCount * 2。

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

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

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

下面是輸出結(jié)果

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,本質(zhì)是一樣的。

用法4

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

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

IServiceCollection services = new ServiceCollection();
services.AddSingleton();
services.AddSingleton(s =>
{
 var provider = s.GetRequiredService();
 return provider.Create(new DemoPooledObjectPolicy());
});
ServiceProvider serviceProvider = services.BuildServiceProvider();
var pool = serviceProvider.GetService>();
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的注冊,然后直接拿它的實例去創(chuàng)建一個Object Pool即可。

如果想在其他地方用,通過構(gòu)造函數(shù)注入即可。

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

總結(jié)

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

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

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

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

?LeakTrackingObjectPool

?StringBuilderPooledObjectPolicy

最后用一個腦圖結(jié)束本文。


如何在.NET Core中使用Object Pool

上述就是小編為大家分享的如何在.NET Core中使用Object Pool了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁名稱:如何在.NETCore中使用ObjectPool-創(chuàng)新互聯(lián)
瀏覽路徑:http://weahome.cn/article/jdics.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部