也就是说,当对象从池中取出超过指定容量的对象数量,虽然归还了相同数量的对象,但对象池只允许容纳 2 个对象,第三个对象不会被池化。
在 ASP.NET Core 中使用ASP.NET Core 框架内置好了 Microsoft.Extensions.ObjectPool,不需要单独安装。官方文档有个基于 ASP.NET Core 的使用示例:
https://docs.microsoft.com/en-us/aspnet/core/performance/objectpool
这个例子把 StringBuilder 做了池化。我这里就直接贴官方的例子了,为了更直观些,我把无关的代码简化掉了。
先定义一个中间件:
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()); } finally // 即使出错也要保证归还对象 { builderPool.Return(stringBuilder); } } }
在 Startup 中注册相应的服务和中间件:
public class Startup { public void ConfigureServices(IServiceCollection services) { services.TryAddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>(); services.TryAddSingleton<ObjectPool<StringBuilder>>(serviceProvider => { var provider = serviceProvider.GetRequiredService<ObjectPoolProvider>(); var policy = new StringBuilderPooledObjectPolicy(); return provider.Create(policy); }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseMiddleware<BirthdayMiddleware>(); } }
这个示例用了 DefaultObjectPoolProvider,它是默认的对象池 Provider,所以你也可以自定义自己的对象池 Provider。
总结Microsoft.Extensions.ObjectPool 提供的对象池功能还是挺灵活的。普通场景使用使用默认的池化策略、默认的对象池和默认的对象池提供者就可以满足需求,也可以自定义其中任意某部件来实现比较特殊或复杂的需求。
对象池的使用原则是:有借有还,再借不难。当调用组件从对象池中借走一个对象实例,使用完后应立即归还给对象池,以便重复利用,避免因过多的对象初始化影响系统性能。
到此这篇关于.NET Core中如何实现或使用对象池的文章就介绍到这了,更多相关.NET Core使用对象池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!