了解或者认识KT:
http://www.cnblogs.com/kingthy/archive/2011/08/08/2130973.html
在项目中如何使用KT?
KT是一个库,所以将KT的dll文件引用到您的项目上即可使用KT里的函数功能。
本节将介绍大家认识KT库里的对象池和如何使用它们。KT里的对象池对象都存放在“KT.Core.ObjectPool“下,当你已在你的项目里引用了KT库后,则写下以下代码就可以使用到KT里的所有对象池了。
using KT.Core.ObjectPool;
先了解一下对象池
对象池,顾名思义就是用于存储对象的池(汗-_-!!),在它的生命周期内维护着它里面的所有对象,确保在同一个生命周期内对象池里的数据的唯一性。当对象池被销毁时,它里面的所有对象也将跟着销毁。
它的接口定义:
/// <summary> /// 对象池接口 /// </summary> public interface IObjectPool : IDisposable { /// <summary> /// 添加对象,如果已存在key,则更新旧值 /// </summary> /// <param name="key">键值</param> /// <param name="value"></param> void Add(object key, object value); /// <summary> /// 判断是否存在某个对象 /// </summary> /// <param name="key"></param> /// <returns></returns> bool Contains(object key); /// <summary> /// 移除某个对象 /// </summary> /// <param name="key"></param> /// <returns></returns> bool Remove(object key); /// <summary> /// 返回某个对象,如果不存在则返回null /// </summary> /// <param name="key"></param> /// <returns></returns> object Get(object key); /// <summary> /// 返回对象池中已存储的对象数量 /// </summary> int Count { get; } /// <summary> /// 清空对象池 /// </summary> void Clear(); }
目前在KT里实现了此接口的共有两个对象,如下:
其中DictionaryObjectPool是采用Hashtable实现的对象池,用于向其它对象池提供基础服务。ObjectPoolBase则是一个抽象类,是其它对象池的基类。
对象池的种类
根据生命周期的不同,可分为不同种类的对象池,KT目前共有以下几种:
A、WebApplicationObjectPool: 基于ASP.NET 应用程序的对象池
对于同一个ASP.NET应用程序(同一个Web站点程序)来说,对象池里的数据都是共用的,使用示例:
WebApplicationObjectPool.Instance.Add("数据", "数据值"); var value1 = WebApplicationObjectPool.Instance.Get("数据").As<string>(); //通过扩展方法获取数据 var value2 = WebApplicationObjectPool.Instance.GetOrAdd<string>("数据1", () => "数据值1");
注意:如果需要在ASP.NET应用程序结束时自动回收数据,请在Global.asax里的Application_End事件里加上回收代码,如下示例:
protected void Application_End(object sender, EventArgs e) { WebApplicationObjectPool.Instance.Dispose(); }
B、WebSessionObjectPool : 基于ASP.NET Session会话期的对象池
对于同一个Session会话来说,对象池里的数据都是共用的,使用示例:
WebSessionObjectPool.Instance.Add("数据", "数据值"); var value1 = WebSessionObjectPool.Instance.Get("数据").As<string>(); //通过扩展方法获取数据 var value2 = WebSessionObjectPool.Instance.GetOrAdd<string>("数据1", () => "数据值1");
注意:如果需要在Session失效时自动回收数据,请在Global.asax里的Session_End事件里加上回收代码,如下示例:
protected void Session_End(object sender, EventArgs e) { WebSessionObjectPool.Instance.Dispose(); }
C、WebRequestObjectPool : 基于ASP.NET Request请求上下文的对象池
对于同一个Http Web Request会话来说,对象池里的数据都是共用的,使用示例:
.Instance.Add("数据", "数据值"); var value1 = .Instance.Get("数据").As<string>(); //通过扩展方法获取数据 var value2 = .Instance.GetOrAdd<string>("数据1", () => "数据值1");
注意:如果需要在Http Request完成时自动回收数据,请在web.config里注册WebRequestObjectPoolModule,如下示例:
<httpModules> <add name="WebRequestObjectPoolModule" type="KT.Core.ObjectPool.WebRequestObjectPoolModule" /> </httpModules>
D、ThreadCallObjectPool : 基于线程调用的对象池。此对象池可以在ASP.NET和Application环境下使用。
对于同一个线程来说,对象池里的数据是共用的。使用示例:
public class Program { static void Main(string[] args) { for (var i = 0; i < 100; i++) { Thread th = new Thread(()=>{ var name = ThreadCallObjectPool.Instance.GetOrAdd<string>("K", ()=>Thread.CurrentThread.Name); Console.WriteLine("Thread: {0}, K={1}", Thread.CurrentThread.Name, name); Thread.Sleep(10); Console.WriteLine("Thread: {0}, K={1}", Thread.CurrentThread.Name, ThreadCallObjectPool.Instance.Get("K")); }); th.Name = i.ToString(); th.Start(); } Console.Read(); } }
使用对象池上下文
KT里提供一个当前上下文的对象池调用“ObjectPoolContext”,此对象会自动根据您所处的上下文环境,调用对应的对象池实例。比如你当前的程序是运行在ASP.NET Web环境下,则会调用WebRequestObjectPool而如果是在Application环境下则会调用ThreadCallObjectPool对象池,如下示例代码:
/// <summary> /// 商家模块 /// </summary> public IMerchantsModule MerchantsModule { get { return ObjectPoolContext.Current.GetOrAdd<IMerchantsModule>( typeof(MerchantsModule), () => { return new MerchantsModule(this.DbHelper); }); } } 以上代码,不管是在ASP.NET环境还是在Application环境都可以正常运行。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110572.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...