.net core中的对象池
asp.net core中通过扩展库的方式提供给了一个标准的对象池ObjectPool,定义在Microsoft.Extensions.ObjectPool.dll 程序集中。它本身是个纯虚的抽象类,它就定义了两个接口函数,实现如下 public?abstract?class?ObjectPool<T>?where?T?:?class 这是一个比较典型的对象池接口:
由于抽象类ObjectPool无法直接使用,虽然接口实现并不复杂,但实现起来还是要花一番功夫的。因此,该库也还提供了一个默认实现DefaultObjectPool,如下就是一个简单的示例:? public class Program { public static void Main(string[] args) { var policy = new DefaultPooledObjectPolicy<TestData>(); var pool = new DefaultObjectPool<TestData>(policy,100); var obj = pool.Get(); pool.Return(obj); var obj2 = pool.Get(); Console.WriteLine(obj.Equals(obj2)); } } class TestData { public string Id { get; set; } public string Name { get; set; } public int Value { get; set; } } DefaultObjectPool是一个默认的实现,它是线程安全的,我们可以放心在多线程环境下使用。它有两个输入参数:对象池策略IPooledObjectPolicy和线程池容量。 对象池策略IPooledObjectPolicy接口定义如下:? public interface IPooledObjectPolicy<T> { T Create(); bool Return(T obj); } 它声明了对象的创建和释放的行为。接口看起来和线程池的接口非常相似,这样设计的好处有:
系统默认也有一个IPooledObjectPolicy的实现DefaultPooledObjectPolicy,它的实现如下:? public class DefaultPooledObjectPolicy<T> : PooledObjectPolicy<T> where T : class,new() { public override T Create() { return new T(); } public override bool Return(T obj) { return true; } } 非常简单,并且大多数的时候也够用。当然,我们也可以根据需要实现自己的IPooledObjectPolicy。甚至也可以扩展DefaultObjectPool来实现自己的线程池。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 利用ASP.netCore自带DI(DependencyInjection)实现批量依赖注
- asp.net-mvc – ASP.NET MVC – 脚本组合
- asp.net-mvc – 为什么InitializeSimpleMembershipAttribut
- asp.net-mvc-3 – MVC 3上的单元测试控制器为结果返回null,
- 如何实现ASP.NET Web应用程序的自动错误/崩溃报告?
- asp.net-mvc – ASP.NET MVC中UpdateModel的正确行为是什么
- asp.net-mvc – ASP.NET MVC3视图授权设计
- asp.net-mvc – 在ASP.NET MVC中定制授权
- WeihanLi.Npoi 1.7.0 更新
- asp.net – 什么时候不应该使用Web服务?