代码编织梦想

Nuget

Microsoft.Extensions.ObjectPool

使用对象池的好处

减少初始化/资源分配,提高性能。这一条与线程池同理,有些对象的初始化或资源分配耗时长,复用这些对象减少初始化和资源分配。比如:我有一个执行耗时约500毫秒,内存空间 2KB的任务为此创建一个新线程异步执行,而创建线程耗时1秒,内存空间占用1MB则得不偿失。

使用步骤

安装Nuget包:Install-Package Microsoft.Extensions.ObjectPool

builder.Services.TryAddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();

使用对象池的第一步是实现IPooledObjectPolicy接口,要告诉对象池如何创建需要复用的对象

IPooledObjectPolicy接口有两个方法,

T Create()负责创建复用对象。

Return负责将复用的对象释放回对象池中。如果不调用Return,表示该对象在对象池被移除。

//对象池框架接口
public interface IPooledObjectPolicy<T> where T : notnull
{
    T Create();
    bool Return(T obj);
}

//我的复用对象的接口实现
public class ReuseObjectPolicy : IPooledObjectPolicy<ReuseObject>
{
    public ReuseObject Create()
    => new(DateTime.Now);

    public bool Return(ReuseObject obj)
    => true;
}
builder.Services.TryAddSingleton(serviceProvider =>
{
    var provider = serviceProvider.GetRequiredService<ObjectPoolProvider>();
    var policy = new ReuseObjectPolicy();
    return provider.Create(policy);
});

对象使用通过依赖注入获取泛型ObjectPool对象的Get使用,关于泛型ObjectPool的定义如下

T Get()负责获取复用对象。

Return负责将复用的对象释放回对象池中。如果不调用Return,表示该对象在对象池被移除。

public abstract class ObjectPool<T> where T : class
{
    public abstract T Get();
    public abstract void Return(T obj);
}

获取ReuseObject复用对象,通过打印的创建事件和计数器可以知道,对象被复用了。而如果不调用Return,则会重新创建新的对象。

public class ReuseObject 
{
    private static  int _counter = 0;
    public ReuseObject(DateTime time)
    {
        Time = time;
        Interlocked.Increment(ref _counter);

        Console.WriteLine($"{Time}被创建了{_counter}次");
    }

    public DateTime Time { get; set; }
}

public class ObjectPoolController : ControllerBase
{
    private readonly ReuseObject _reuseObject;

    public ObjectPoolController(ObjectPool<ReuseObject> objectPool)
    {
        _reuseObject = objectPool.Get();
    }

    [HttpGet]
    public IActionResult Get()
    {
        var reuseObject = _objectPool.Get();
        try
        {
            Console.WriteLine($"创建时间是:{reuseObject.Time}");
        }
        finally
        {
            _objectPool.Return(reuseObject);
        }
        return Ok();
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/XuYuDong_/article/details/130913236

SuperSocket教程C#/.Net core/.Net 5开发使用SuperSocket2.0启动Socket服务附带代码实例net core supersocket-爱代码爱编程

SuperSocket教程C#/.Net core/.Net 5使用SuperSocket2.0开发Socket服务附带代码实例 net core supersocket 最近看到SuperSocket2.0已经发布了多个预览版了,于是用.Net core 5学习了一下SuperSocket2.0的使用方法,并且编写了一个例子,本例程用到了自定义数据包和

C#/.net core简单认识-爱代码爱编程

C# 基础 1c#语言及其特点 c#是微软公司发布的一种面向对象的、运行于.net framework和.net core(完全开源。跨平台)之上的程序设计语言c#是一种**安全的、稳定的、简单的、优雅的、**由c和c++衍生出来的面向对象的编程语言。他在继承c和c++强大功能的同时去掉了一些它们的复杂特性c#是面向对象的变成语言。2、认识.Net F

c# asp.net core web api mysql使用教程(三)-爱代码爱编程

接上两篇文章继续:C# ASP.NET Core Web API 身份授权(JWT)验证(一)_蛋蛋の微笑的博客-CSDN博客C# ASP.NET Core Web API 身份授权(JWT)验证https://blog.csdn.net/u012402739/article/details/128463873 C# ASP.NET Core Web A

c#/asp.net连接sql server,及基本使用方法-爱代码爱编程

如何使用ASP.NET连接SQL Server,有种方法是去修改配置文件然后再作为账号和密码。这种方式很正规但也比较麻烦,下面来看看一种极其简单得连接方法。 该方法需要连接目标SQL Server 的服务器名称,SQL Server中目标数据库名,登录名,密码。这些都可以在微软自带的SQL Server管理器上找到。

【c#/.net/.net core】动态库调用以处理试图加载格式不正确的程序异常。错误代码0x8007000b-爱代码爱编程

【C#/.NET/.NET CORE】动态库调用及处理试图加载格式不正确的程序异常。异常代码:0X8007000B 动态库调用【异常】试图加载格式不正确的程序。0X8007000B一、客户端调用DLL动态库异常二、服

grial ui kit for .net maui crack-爱代码爱编程

Grial UI Kit for .NET MAUI Crack   Added new 'Smart Home Flow' - The Smart Home Flow consists of 3 pages, 4 templates and 1 popup, that work together to create a neat experience.

图表控件lightningchart .net v.10.4.1已经发布!新增datacursor功能、zoombar自定义控件-爱代码爱编程

LightningChart.NET原名LightningChart Ultimate SDK,是一款高性能WPF和Winforms图表,可以实时可视化多达1万亿个数据点。LightningChart完全由GPU加速,并且性能经过优化,可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D,高级3D,Polar,Smith

c#/.net/.net core优秀项目框架推荐_c# 开发框架-爱代码爱编程

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。💛Pyth