首页 > 编程语言 >ASP.NET Core对象池

ASP.NET Core对象池

时间:2023-08-07 21:47:07浏览次数:42  
标签:Core ASP Return 对象 复用 ObjectPool NET public objectPool

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

 

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 ObjectPool<ReuseObject> _objectPool;


    public ObjectPoolController(ObjectPool<ReuseObject> objectPool)
    {
      _objectPool = objectPool;
    }

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

 

 

 

标签:Core,ASP,Return,对象,复用,ObjectPool,NET,public,objectPool
From: https://www.cnblogs.com/Leo_wl/p/17612782.html

相关文章

  • .Net 构建Opc Ua服务器和客户端
    PackagenamedOpc.UaFx.Advancedisfoundinhttps://www.nuget.org/packages/Opc.UaFx.AdvancedthatusedasaOpcUaServerandClient.Firstofall.InstallpackagedotnetaddpackageOpc.UaFx.Advanced--version2.31.0usingOpc.UaFx;usingOpc.UaFx.Client;......
  • nacos 系列:.net core 6.0 使用 nacos
    目录安装Nuget包配置appsettings.json添加服务和配置测试官方示例:https://kgithub.com/nacos-group/nacos-sdk-csharp安装Nuget包dotnetaddpackagenacos-sdk-csharp.AspNetCoredotnetaddpackagenacos-sdk-csharp.Extensions.Configuration配置appsettings.json......
  • rider下载安装 一款.Net跨平台开发神器 安装指南
    rider下载安装一款.Net跨平台开发神器安装指南原文链接:https://baijiahao.baidu.com/s?id=1763943888509043020&wfr=spider&for=pc下载破解补丁后,解压得到,如下图:将上面图示的补丁的所属文件夹/jetbra复制电脑某个位置,小编这里放置到了默认的下载目录下(不推荐,自己选个D盘目......
  • 从浅入深了解.NET Core MVC 2.x全面教程
    一、基础1.默认配置使用KestrelWebServerASP.NETCore内置——跨平台IIS集成UseIIS()UseIISIntergration()LogIConfiguration接口2.IConfiguration配置信息的来源appsettings.jsonUserSerets环境变量命令行参数XML...3.管道4.MVC5.路由RoutingConcentionalRoutingAttributeRou......
  • OWASP-Top-10-for-LLMs-2023
    一、LLM01:PromptInjection0x1:攻击原理这通过特殊构造的输入来污染/覆盖prompt提示,以此攻击一个大型语言模型(LLM),使其产生非预期的意外行为。提示注入漏洞(PromptInjectionVulnerability)是指攻击者通过精心构造的输入,操控一个大型语言模型(LLM),使得LLM在不知情的情况下执行攻......
  • How to get User Name from External Login in ASP.NET Core?
    HowtogetUserNamefromExternalLogininASP.NETCore? 回答1DoyouhaveaccesstoSignInManagerorcanyouinjectit?Ifyes,thenthisishowyouwouldaccessuserid(username),email,first&lastname:publicclassMyController:Microsoft.Asp......
  • 后台是.net的话前端该用什么框架??
    如果你在后端使用.NET,以下是几个流行的前端框架可以考虑使用:1.React:-优点:React是一个由Facebook开发的JavaScript库,它专注于构建用户界面。它采用组件化的开发模式,使得构建复杂的UI变得简单且可维护。React具有高度的灵活性和可重用性,能够提供出色的性能。2.Angular:-......
  • kubernetes-Deployment和DaemonSet
    在Kubernetes中,Deployment和DaemonSet是两个不同的资源类型,用于不同的目的。Deployment用于在集群中运行可扩展的应用程序,可以管理Pod的副本数量,执行滚动升级和回滚操作。DaemonSet用于确保在集群的每个节点上运行一个Pod副本。它通常用于部署运行在每个节点上的系统级别的服务......
  • 无涯教程-Perl - endnetent函数
    描述此功能告诉系统您不再希望使用getnetent从网络列表中读取条目。语法以下是此函数的简单语法-endnetent返回值此函数不返回任何值。例以下是显示其基本用法的示例代码-#!/usr/bin/perluseSocket;while(($name,$aliases,$addrtype,$net)=getnetent())......
  • Word控件Spire.Doc 转换教程(一):在 C#、VB.NET 中将 Word Doc 转换为 XML
    谈到OfficeOpenXML,我们可能会想到HTML。实际上,OfficeOpenXML与HTML类似,都是基于标签的语言。OfficeOpenXML和HTML之间的区别在于OfficeOpenXML使用的标记不是预定义的。如果我们在OfficeOpenXML中创建自己的标签,我们需要遵循一些规则。首先,OfficeOpenXML文档中......