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

这篇具有很好参考价值的文章主要介绍了【C#/.NET】使用ASP.NET Core对象池。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Nuget

Microsoft.Extensions.ObjectPool

 文章来源地址https://www.toymoban.com/news/detail-462168.html

使用对象池的好处

减少初始化/资源分配,提高性能。这一条与线程池同理,有些对象的初始化或资源分配耗时长,复用这些对象减少初始化和资源分配。比如:我有一个执行耗时约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();
    }
}

 

 

 

到了这里,关于【C#/.NET】使用ASP.NET Core对象池的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ASP.NET CORE API 使用Orleans

    快速使用Monimal API 快速集成Orleans 微软官网地址如下: https://learn.microsoft.com/zh-cn/dotnet/orleans/quickstarts/build-your-first-orleans-app?source=recommendationstabs=visual-studio 当然它的存储grain存储采用的是内存级别存储,我缓存了mssql 存储。如果是内存存储使用如下代码就Ok 我采用的是数据库存

    2024年02月06日
    浏览(53)
  • 聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(完结篇)

    还是先上代码, 这是基础版本我们要达成的目标,仅需定义一个特性即可完成拦截的目标 如上是我们定义的拦截器基类,我们想要达到的目标是,只要继承该基类,并覆写InterceptAsync 方法即可实现具有特定功能的拦截类,而容器会自动代理到该拦截类,实现拦截。 这里要感

    2024年02月02日
    浏览(38)
  • ASP.NET Core使用Hangfire定时发布文章

    也是上了5天班,终于迎来了休息,抽空更新下博客,然后就是下周一公司会对我进行考核,希望考核能通过吧!!! 然后我想给博客添加一个定时发布文章的功能,其实这个功能对于我的博客是没什么作用的,什么时候发都没什么人看。但是咱还是要有这个功能。 我为文章

    2024年02月08日
    浏览(43)
  • 聊一聊为什么我要整合Microsoft.Extensions.DependencyInjection和Castle.Core

    如果用到动态代理,大家可能会有几种选择,排到前列的是Autofac+Castle、AspectCore和DoraInterception, 我将从我当时研究的经历,以及我遇到的场景,为大家展示下 聊一聊我为什么要费时费力的整合Microsoft.Extensions.DependencyInjection和Castle.Core 直接上源码 如上所示的接口定义了一个事

    2024年02月01日
    浏览(62)
  • ASP.NET Core MVC 使用 JWT 的示例

    创建一个 ASP.NET Core MVC 项目。 添加 NuGet 包: Microsoft.AspNetCore.Authentication.JwtBearer:用于支持 JWT 的身份验证。 System.IdentityModel.Tokens.Jwt:用于生成和验证 JWT。 在 Startup.cs 文件中做如下修改: 请注意,在上述代码中,您需要将以下参数替换为实际的值: \\\"your_issuer\\\" :发行者的标

    2024年02月13日
    浏览(40)
  • ASP.NET Core Web API入门之三:使用EF Core

    一般来讲我们做项目都会用实体类跟数据库实体进行关系对应,这样的好处方便我们维护、增删改查,并且可以减少SQL的编写,从而统一风格,那么 Entity Framework Core 就是很不错的ORM框架。 1、跨数据库支持能力强大,只需修改配置就可以轻松实现数据库切换。 2、提升了开发效

    2024年02月10日
    浏览(53)
  • .NET服务发现(Microsoft.Extensions.ServiceDiscovery)集成Consul

    随着Aspire发布preview5的发布,Microsoft.Extensions.ServiceDiscovery随之更新, 服务注册发现这个属于老掉牙的话题解决什么问题就不赘述了,这里主要讲讲Microsoft.Extensions.ServiceDiscovery(preview5)以及如何扩展其他的中间件的发现集成 . Microsoft.Extensions.ServiceDiscovery官方默认提供的Config,DNS,YAR

    2024年04月11日
    浏览(52)
  • ASP.NET Core 中使用 WebSocket 协议进行实时通信

    介绍 在 ASP.NET Core 中使用 WebSocket 协议创建实时通信的完整示例涉及几个步骤。在此示例中,我们将创建一个简单的聊天应用程序,用户可以在其中实时发送和接收消息。此示例假设您对 ASP.NET Core 和 C# 有基本了解。 步骤1.创建一个新的ASP.NET Core项目 首先,使用 Visual Studio 或

    2024年01月25日
    浏览(50)
  • 【ASP.NET Core】使用SignalR推送服务器日志

    一个多月前接手了一个产线机器人项目,上位机以读写寄存器的方式控制机器人,服务器就是用 ASP.NET Core 写的 Web API。由于前一位开发者写的代码质量问题,导致上位机需要16秒才能启动。经过我近一个月的改造,除了保留业务逻辑代码,其他的基本重写。如今上位机的启动

    2024年02月03日
    浏览(56)
  • 使用任务计划开机启动ASP.NET Core应用程序

    ASP.NET Core应用程序现在是一个控制台应用程序,在Windows上直接双击启动,但如果想让开发完成的ASP.NET Core应用程序开机启动,可以将ASP.NET Core应用程序修改成Windows服务运行,但这需要额外添加代码,也可以使用IIS来托管ASP.NET Core应用程序,但可能需要安装一些支持IIS的组件

    2024年02月08日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包