首页 > 编程语言 >【C#/.NET】使用ASP.NET Core对象池

【C#/.NET】使用ASP.NET Core对象池

时间:2023-05-28 15:44:51浏览次数:37  
标签:Core ASP Return ReuseObject 对象 复用 ObjectPool NET public

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();
    }
}

 

 

 

标签:Core,ASP,Return,ReuseObject,对象,复用,ObjectPool,NET,public
From: https://www.cnblogs.com/xuyd/p/17438313.html

相关文章

  • kubernetes yaml文件详解
    pod.yaml配置#yaml格式的pod定义文件完整内容:apiVersion:v1#必选,版本号,例如v1kind:Pod#必选,指定创建资源的角色/类型metadata:#必选,资源的元数据/属性name:string#必选,资源的名字,在同一个namespace中必须唯一namespace:string......
  • Go语言实战Kubernetes:使用Go编写高效的容器编排应用
    Go语言实战Kubernetes:使用Go编写高效的容器编排应用随着云计算和容器化技术的发展,Kubernetes已成为一个广泛采用的容器编排平台。本文将介绍如何使用Go语言编写高效的Kubernetes应用程序。Go语言和KubernetesGo是一种快速、可靠、简单的编程语言,由Google开发。它在网络编程和并发编......
  • Kubernetes存储卷
    一、存储卷基础1.1背景Pod本身具有生命周期,其应用容器及生成的数据均无法独立于该生命周期之外持久存在。同一Pod中的容器默认共享PID、network、IPC(进程间通信)、UTS名称空间,但Mount和USER仍各自独立。因此跨容器间的进程彼此间默认无法基于共享的存储空间交换数据。由此看来,借......
  • Uncovering the Representation of Spiking Neural Networks Trained with Surrogate
    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! PublishedinTransactionsonMachineLearningResearch(04/2023)......
  • ASP.NET Core 8 预览版 4的重大更新
    最新版本的.NET8预览版4对ASP.NETCore进行了重大改进。值得注意的增强功能包括Blazor的流式呈现和表单处理、在最小API中扩展对表单绑定的支持、用于提高性能的NativeAOT编译、使用标识API终结点增强的身份验证和授权,以及添加用于应用程序监视的指标。在.NET团队......
  • netcore MiniAPI的使用
    usingMicrosoft.EntityFrameworkCore;publicstaticclassProductsModule{publicstaticvoidRegisterProductsEndpoints(thisIEndpointRouteBuilderendpoints){endpoints.MapGet("/products",async(MemberDbContextdbContext)=>......
  • How to boot the Raspberry Pi system from a USB Mass Storage Device All In One
    HowtoboottheRaspberryPisystemfromaUSBMassStorageDeviceAllInOne如何从USB启动树莓派引导系统/如何从USB大容量存储设备启动RaspberryPi系统https://www.raspberrypi.com/news/pi-3-booting-part-i-usb-mass-storage-boot/officaildocsThispag......
  • 错误解决:These dependencies were not found: core-js/modules/es.array.push.js
    错误描述执行npmrundev后报错:Thesedependencieswerenotfound:core-js/modules/es.array.push.jsin./node_modules/@babel/runtime/helpers/objectSpread2.js,./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-pluvue?vue&type=script&la......
  • net core中BackgroundService
    publicclassPeriodicBackgroundTask:BackgroundService{privatereadonlyTimeSpan_period=TimeSpan.FromSeconds(5);privatereadonlyILogger<PeriodicBackgroundTask>_logger;publicPeriodicBackgroundTask(ILogger<PeriodicBackgroundT......
  • (86) C# dotnet卸载工具
     卸载工具-.NET|MicrosoftLearndotnet/cli-lab: (github.com)......