ASP.NET Core 对象池化技术

写在前面

Microsoft.Extensions.ObjectPool 是 ASP.NET Core 基础结构的一部分,当对象的初始化成本较高,并且可能被频繁使用时,才适合采用对象池技术;被ObjectPool管理的对象不会进入垃圾回收,使用时通过由实例对象实现的Get()方法,从对象池中借出对象,用完之后调用Return(T obj)方法,将对象还回去。也可以在Return(T obj)方法中设置判断条件,仅允许特定的对象进入对象池。

通过NuGet 获取 Microsoft.Extensions.ObjectPool 类库

代码实现

using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.ObjectPool;
using System.Security.Cryptography;
using System.Text;var builder = WebApplication.CreateBuilder(args);// DefaultPooledObjectPolicy: 默认的策略,继承抽象类PooledObjectPolicy
builder.Services.TryAddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();builder.Services.TryAddSingleton<ObjectPool<ReusableBuffer>>(serviceProvider =>
{var provider = serviceProvider.GetRequiredService<ObjectPoolProvider>();var policy = new DefaultPooledObjectPolicy<ReusableBuffer>();return provider.Create(policy);
});builder.Services.TryAddSingleton<ObjectPool<Person>>(serviceProvider => {var provider = serviceProvider.GetRequiredService<ObjectPoolProvider>();var policy = new PersonPoolPolicy();return provider.Create(policy);
});builder.Services.TryAddSingleton<ObjectPool<StringBuilder>>(serviceProvider =>
{var provider = serviceProvider.GetRequiredService<ObjectPoolProvider>();var policy = new StringBuilderPooledObjectPolicy();return provider.Create(policy);
});var app = builder.Build();// config middleware
app.UseMiddleware<BirthdayMiddleware>();app.MapGet("/", () => "Hello rjcql!");// return the SHA256 hash of a word 
http://localhost:5128/hash/xxxx
app.MapGet("/hash/{word}", (string word, ObjectPool<ReusableBuffer> bufferPool) =>
{var buffer = bufferPool.Get();try{// Set the buffer data to the ASCII values of a wordfor (var i = 0; i < word.Length; i++){buffer.Data[i] = (byte)word[i];}Span<byte> hash = stackalloc byte[32];SHA256.HashData(buffer.Data.AsSpan(0, word.Length), hash);return "Hash: " + Convert.ToHexString(hash);}finally{// Data is automatically reset because this type implemented IResettablebufferPool.Return(buffer);}
});app.MapGet("/create/{name}", (string name, ObjectPool<Person> personPool) =>
{var person = personPool.Get();try{person.Id = Guid.NewGuid().ToString("N");var lastName = person.Name; // 这个是上一个对象的值person.Name = name;return $"{person.Id}:{person.Name}, {lastName}";}finally{// 根据条件回收personPool.Return(person);}
});app.Run();public class ReusableBuffer : IResettable
{public byte[] Data { get; } = new byte[1024 * 1024]; // 1 MBpublic bool TryReset(){Array.Clear(Data);return true;}
}public class Person
{public string Id { get; set; }public string Name { get; set; }
}public class PersonPoolPolicy : PooledObjectPolicy<Person>
{public override Person Create(){return new Person { Id = "", Name = "rjcql" };}public override bool Return(Person p){if (p.Name != "rjcql"){// 不允许其他名称的对象放入对象池return false;}return true;}
}/// <summary>
/// 创建中间件
/// </summary>
public class BirthdayMiddleware
{private readonly RequestDelegate _next;public BirthdayMiddleware(RequestDelegate next){_next = next;}public async Task InvokeAsync(HttpContext context, ObjectPool<StringBuilder> builderPool){var stringBuilder = builderPool.Get();try{stringBuilder.Append("Hi");// 在中间干点啥别的// await context.Response.WriteAsync(stringBuilder.ToString());await _next.Invoke(context);}finally // 即使出错也要保证归还对象{builderPool.Return(stringBuilder);}}
}

调用示例

 

 

 

 因为设置了回收条件,所以只有名字为rjcql的对象才会被回收,所以每次调用都先把rjcql对象取出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录Qt和opencv 新环境配置过程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Qt是什么&#xff1f;二、Qt的版本三、安装步骤1.下载Qt2.双击安装包.exe开始安装3. 需要登陆才能继续安装&#xff0c;没有的就用邮箱注册账号4.注意安装路…

Message queue 消息队列--RabbitMQ 【基础入门】

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是平顶山大师&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Message queue 消息队列--RabbitMQ 【基础入门…

Docker进阶篇-安装MySQL主从复制

一、MySQL主服务器 1、新建主服务器容器实例3307 docker run -p 3307:3306 \--name mysql-master \--privilegedtrue \-v /mydata/mysql-master/log:/var/log/mysql \-v /mydata/mysql-master/data:/var/lib/mysql \-v /mydata/mysql-master/conf:/etc/mysql \-e MYSQL_ROOT_…

Linux编辑器---vim

目录 1、vim的基本概念 2正常/普通/命令模式(Normal mode) 2、1命令模式下一些命令&#xff08;不用进入插入模式&#xff09; 3插入模式(Insert mode) 4末行/底行模式(last line mode) 4、1底行模式下的一些命令 5、普通用户无法进行sudo提权的解决方案 6、vim配置问题 6、1配…

基于 Redis 实现高性能、低延迟的延时消息的方案演进

1、前言 随着互联网的发展&#xff0c;越来越多的业务场景需要使用延迟队列。比如: 任务调度:延时队列可以用于任务调度&#xff0c;将需要在未来某个特定时刻执行的任务放入队列中。消息延迟处理: 延时队列可以用于消息系统&#xff0c;其中一些消息需要在一段时间后才能被消…

RK3568平台 HDMI交换机芯片PI3HDX231

一.简介 HDMI交换机芯片是一款可以同时输入几路HDMI的芯片&#xff0c;通过设计交换机芯片的寄存器值&#xff0c;已选择 其中一路作为输出。 I3HDX231是3:1 HDMI线性ReDriver交换机&#xff0c;支持每通道6 Gbps的数据速率&#xff0c;4096 x 2160像素分辨率&#xff0c;彩色…

Yolov7, Yolov8使用

YOLOV7 1. 安装和测试&#xff1a; 【小白教学】如何用YOLOv7训练自己的数据集 - 知乎 YOLOv7——训练自己的数据集 - 代码网 conda create --nameyolov7 python3.8 #the version of your python3 *** 这里需要注意如果 torch 和torchvion版本太高&#xff0c;会导致GPU不可…

Python项目——搞怪小程序

1、介绍 使用python编写一个小程序&#xff0c;回答你是猪吗。 点击“是”提交&#xff0c;弹窗并退出。 点击“不是”提交&#xff0c;等待5秒&#xff0c;重新选择。 并且隐藏了关闭按钮。 2、实现 新建一个项目。 2.1、设计UI 使用Qt designer设计一个UI界面&#xff0c…

《Python数据分析技术栈》第03章 01 正则表达式(Regular expressions)

01 正则表达式&#xff08;Regular expressions&#xff09; 《Python数据分析技术栈》第03章 01 正则表达式&#xff08;Regular expressions&#xff09; A regular expression is a pattern containing both characters (like letters and digits) and metacharacters (li…

Java 变量与标识符(命名规范)

变量 变量表示内存中的一个存储区域&#xff08;不同的变量&#xff0c;类型不同&#xff0c;占用的空间大小不同&#xff09;。 在Java中&#xff0c;每一个变量都有一个类型&#xff08;type&#xff09;&#xff0c;变量的类型位于变量名之前。**变量名必须是以一个字母开…

添加dns解析缓存

添加dns解析缓存&#xff0c;加速页面访问 1、查询网址的ip地址 例如需要加速访问github.com&#xff0c;打开网站 IPAddress.com 查询 github.global.ssl.fastly.net 和 github.com 两个地址 找到对应的IP地址在命令行Ping通 2、修改本地hosts文件 windows系统的hosts文件…

深入解析JavaScript中箭头函数的用法

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 箭头函数(Arrow function)是JavaScript ES6中引入的一大特性。箭头函…

739.每日温度 496.下一个更大元素 I

739.每日温度 496.下一个更大元素 I 739.每日温度 力扣题目链接(opens new window) 请根据每日 气温 列表&#xff0c;重新生成一个列表。对应位置的输出为&#xff1a;要想观测到更高的气温&#xff0c;至少需要等待的天数。如果气温在这之后都不会升高&#xff0c;请在该位…

Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin(二)

Android Matrix绘制PaintDrawable设置BitmapShader&#xff0c;手指触点为圆心scale放大原图&#xff0c;Kotlin&#xff08;二&#xff09; 在 Android Matrix绘制PaintDrawable设置BitmapShader&#xff0c;手指触点为圆心scale放大原图&#xff0c;Kotlin-CSDN博客 基础上&…

操作系统——进程管理篇

操作系统——进程管理篇&#xff08;王道23年版&#xff09; 2.1_1_进程的概念、组成、特征 1.进程的概念 程序&#xff1a;是静态的&#xff0c;就是个存放在磁盘里的可执行文件&#xff0c;就是一系列的指令集合 进程&#xff1a;是动态的&#xff0c;是程序的一次执行过…

微服务治理:微服务安全详解

微服务安全旨在保护微服务架构中每一个独立的服务。与传统单体应用程序不同&#xff0c;它们在单点应用安全措施&#xff0c;微服务由于其独立性&#xff0c;需要分布式安全方法。 为何关注微服务安全&#xff1f; 攻击面扩大: 更多服务暴露在外&#xff0c;意味着攻击者拥有…

使用 Swift 代码优化项目编译速度

引言 软件的性能是评价一个软件质量的重要指标&#xff0c;尤其在今天这个时代&#xff0c;性能已成为大型项目不可或缺的考虑因素之一。对于用户量极大的软件&#xff0c;如网银系统、在线购物商城等&#xff0c;更是必须保证其高效稳定的性能。在这种背景下&#xff0c;优化…

【Linux】——期末复习题(一)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

学习笔记应用——创建用户账户并且拥有自己的信息

一、创建用户账户 将建立一个用户注册和身份验证系统&#xff0c;让用户能够注册账户&#xff0c;进而登录和注销。我们将创建一个新的应用程序&#xff0c;其中包含与处理用户账户相关的所有功能。 创建user 我们首先使用命令 startapp 来创建一个名为 users 的应用程序&…

大语言模型无代码构建知识图谱概述

2023年3月15日&#xff0c;ChatGPT4.0的横空出世&#xff0c;将人们对大语言模型的关注推到了风口浪尖。由于其在智能问答、翻译以及文本生成等工作任务上的卓越表现&#xff0c;业界一度出现了不再需要发展知识图谱相关技术的观点&#xff0c;知识图谱相关概念严重受挫。无可置…