广告
返回顶部
首页 > 资讯 > 精选 >.NET Core中对象池Object Pool的使用方法是什么
  • 377
分享到

.NET Core中对象池Object Pool的使用方法是什么

2023-06-25 16:06:25 377人浏览 八月长安
摘要

这篇文章主要讲解了“.net Core中对象池Object Pool的使用方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.NET Core中对象池Ob

这篇文章主要讲解了“.net Core中对象池Object Pool的使用方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.NET Core中对象池Object Pool的使用方法是什么”吧!

一、什么是对象池

对象池简单来说就是一种为对象提供可复用能力的软件设计思路。我们常说有借有还,再借不难,而对象池就是通过借和还这样两个动作来保证对象可以被重复使用,从而节省频繁创建对象的性能开销。对象池最常用的场景是游戏设计,因为在游戏中大量存在着可复用的对象,源源不断的子弹出现并不是循环再生的。在数据库中存在着被称为连接池的东西,每当出现数据库无法连接的情况时,经验丰富的开发人员往往会先检查连接池是否满了,这其实就是对象池模式在特定领域的具体实现。因此对象池本质上就是负责一组对象创建和销毁的容器。 对象池最大的优势是可以自主地管理池子内的每个对象,决定它们是需要被回收还是可以重复使用。我们都知道创建一个新对象需要消耗一定的系统资源,一旦这些对象可以重复地使用就可以节省系统资源开销,这对提高系统性能会非常有帮助。下面的代码实微软官方文档实现的一个简单的对象池:


public class ObjectPool<T> : iobjectPool<T>{private Func<T> _instanceFactory;private ConcurrentBag<T> _instanceItems;public ObjectPool(Func<T> instanceFactory){_instanceFactory = instanceFactory ?? throw new ArgumentNullException(nameof(instanceFactory));_instanceItems = new ConcurrentBag<T>();}public T Get(){T item;if (_instanceItems.TryTake(out item)) return item;return _instanceFactory();}public void Return(T item){_instanceItems.Add(item);}}

二、.net core 中的对象池

.Net Core 中微软已经为我们提供了对象池的实现,即Microsoft.Extensions.ObjectPool。它主要提供了三个核心的组件,分别是ObjectPoolObjectPoolProviderIPooledObjectPolicyObjectPool是一个抽象类,对外提供了Get和Return两个方法,这就是所谓的有借有还。ObjectPoolProvider同样是一个抽象类,它的职责就是创建ObjectPool,它提供了两个Create方法,两者的区别是无参数版本本质上使用的是DefaultPooledObjectPolicy。它和DefaultObjectPool、DefaultObjectPoolProvider都是微软提供的默认实现,IPooledObjectPolicy可以为不同的对象池定义不同的策略,来决定对象如何借、是否可以还。DefaultObjectPool内部使用ObjectWrapper[]来管理对象,ObjectWrapper[]的大小等于 maximumRetained-1,默认情况下maximumRetained等于Environment.ProcessorCount * 2,这里主要用到了Interlocked.CompareExchange()方法,

具体代码如下:

public override T Get(){  var item = _firstItem;  if (item == null || Interlocked.CompareExchange(ref _firstItem, null, item) != item)  {    var items = _items;    for (var i = 0; i < items.Length; i++)    {      item = items[i].Element;      if (item != null && Interlocked.CompareExchange(ref items[i].Element, null, item) == item)      {        return item;      }    }    item = Create();  }  return item;}// Non-inline to improve its code quality as uncommon path[MethodImpl(MethodImplOptions.NoInlining)]private T Create() => _fastPolicy?.Create() ?? _policy.Create();public override void Return(T obj){  if (_isDefaultPolicy || (_fastPolicy?.Return(obj) ?? _policy.Return(obj)))  {    if (_firstItem != null || Interlocked.CompareExchange(ref _firstItem, obj, null) != null)    {      var items = _items;      for (var i = 0; i < items.Length && Interlocked.CompareExchange(ref items[i].Element, obj, null) != null; ++i)      {      }    }  }}

这里用到Interlocked.CompareExchange()方法,Get()方法将items[i].Elementnull进行交换,将指定元素设为 null 并返回原始值。Return()方法将items[i].Element和obj交换后的值不为 null,表示指定元素已经归还,这个方法只有在第一个参数和第三个参数相等时才会发生交换。

说了这么多,我们来看一下对象池具体的用法:

var service = new ServiceCollection();//使用DefaultObjectPoolProviderservice.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();//使用默认策略service.AddSingleton<ObjectPool<Foo>>(serviceProvider =>{  var objectPoolProvider = serviceProvider.GetRequiredService<ObjectPoolProvider>();  return objectPoolProvider.Create<Foo>();});//使用自定义策略service.AddSingleton<ObjectPool<Foo>>(serviceProvider =>{  var objectPoolProvider = serviceProvider.GetRequiredService<ObjectPoolProvider>();  return objectPoolProvider.Create(new FooObjectPoolPolicy());});var serviceProvider = _service.BuildServiceProvider();var objectPool = _serviceProvider.GetService<ObjectPool<Foo>>();//有借有还,两次是同一个对象var item1 = objectPool.Get();objectPool.Return(item1);var item2 = objectPool.Get();Assert.AreEqual(item1, item2);//true//有借无还,两次是不同的对象var item3 = objectPool.Get();var item4 = objectPool.Get();Assert.AreEqual(item3, item4);//false

上面的代码中Foo和FooObjectPoolPolicy是两个工具类:

public class Foo{  public string Id { get; set; }  public DateTime? CreatedAt { get; set; }  public string CreatedBy { get; set; }}public class FooObjectPoolPolicy : IPooledObjectPolicy<Foo>{  public Foo Create()  {    return new Foo()    {      Id = Guid.NewGuid().ToString("N"),      CreatedAt = DateTime.Now,      CreatedBy = "zs"    };  }  public bool Return(Foo obj)  {    return true;  }}

TIP:当你需要控制对象池内的对象如何被创建的时候,你可以考虑实现自定义的IPooledObjectPolicy<T>,反之DefaultPooledObjectPolicy<T>实现完全可以满足你的使用。

感谢各位的阅读,以上就是“.NET Core中对象池Object Pool的使用方法是什么”的内容了,经过本文的学习后,相信大家对.NET Core中对象池Object Pool的使用方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: .NET Core中对象池Object Pool的使用方法是什么

本文链接: https://www.lsjlt.com/news/306174.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • .NET Core中对象池Object Pool的使用方法是什么
    这篇文章主要讲解了“.NET Core中对象池Object Pool的使用方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.NET Core中对象池Ob...
    99+
    2023-06-25
  • .NET Core 中对象池 Object Pool的使用
    目录一、什么是对象池二、.NET Core 中的对象池三、本文小结一、什么是对象池 对象池简单来说就是一种为对象提供可复用能力的软件设计思路。我们常说有借有还,再借不难,而对象池就...
    99+
    2022-11-12
  • ADO.NET对象使用方法是什么
    这篇文章主要讲解了“ADO.NET对象使用方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ADO.NET对象使用方法是什么”吧!在这十天中我想主要提到的对象是:connection对...
    99+
    2023-06-17
  • PHP中PDO是什么,其对象使用的常见方法是什么
    本篇内容介绍了“PHP中PDO是什么,其对象使用的常见方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!PDO是什么PDO是别人写的“...
    99+
    2023-06-20
  • java对象的创建与使用方法是什么
    Java对象的创建与使用方法如下:1. 定义类:在Java中,对象的创建需要先定义类。类是一个抽象的概念,用于描述对象的属性和行为。...
    99+
    2023-05-13
    java对象的创建 java
  • javascript中对象定义的方法是什么
    本篇内容介绍了“javascript中对象定义的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
  • Java中方法和对象的关系是什么
    在Java中,方法和对象是密切相关的。对象是类的实例,它可以拥有属性和行为。方法是对象的行为,它定义了对象可以执行的操作。 在Jav...
    99+
    2023-10-26
    Java
  • java中什么是静态的对象和方法
    什么是静态变量Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。使用 static 可以修饰变量、方法和代码块...
    99+
    2016-04-17
    java入门 java 静态 对象 方法
  • es6中map对象的遍历方法是什么
    这篇“es6中map对象的遍历方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“es...
    99+
    2022-10-19
  • Pandas中DataFrame对象转置的方法是什么
    本篇内容介绍了“Pandas中DataFrame对象转置的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!DataFrame对象本质...
    99+
    2023-07-05
  • java中的session对象及其常用方法是什么
    本篇内容主要讲解“java中的session对象及其常用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中的session对象及其常用方法是什么”吧!session对象用于在会话...
    99+
    2023-06-20
  • JAVA中对象复制与引用的方法是什么
    在Java中,对象的复制可以使用两种方法:浅复制和深复制。1. 浅复制(Shallow Copy):通过复制对象的引用,创建一个新的...
    99+
    2023-08-18
    JAVA
  • javascript中doucument对象的属性和方法是什么
    这篇文章主要介绍了javascript中doucument对象的属性和方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇javascript中doucument对象的属性...
    99+
    2022-10-19
  • BOM中location对象的属性和方法是什么
    这篇文章主要介绍了BOM中location对象的属性和方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇BOM中location对象的属性和方法是什么文章都会有所收获,下面我们一起来看看吧。一、locat...
    99+
    2023-07-05
  • Java面向对象特点与使用方法是什么
    这篇“Java面向对象特点与使用方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java面向对象特点与使用方法是什么...
    99+
    2023-06-30
  • JavaScript中windows.history对象的方法怎么使用
    这篇文章主要讲解了“JavaScript中windows.history对象的方法怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript...
    99+
    2022-10-19
  • jquery中math对象的方法怎么使用
    今天小编给大家分享一下jquery中math对象的方法怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。math对象的方...
    99+
    2023-07-05
  • JavaScript对象的四种使用方式是什么
    这篇“JavaScript对象的四种使用方式是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript对象的四...
    99+
    2023-06-30
  • Java引用对象深度克隆的方法是什么
    在Java中,要实现对象的深度克隆,你可以使用以下方法之一:1. 实现`Cloneable`接口并重写`clone()`方法:```...
    99+
    2023-09-27
    Java
  • JavaScript中的对象解构方法怎么使用
    这篇文章主要介绍“JavaScript中的对象解构方法怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript中的对象解构方法怎么使用”文章能帮助大家解决问题。基础解构const&...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作