zoukankan      html  css  js  c++  java
  • 我的KT库之对象池

    了解或者认识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里实现了此接口的共有两个对象,如下:

    kt_1

    其中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会话来说,对象池里的数据都是共用的,使用示例:

    WebRequestObjectPool.Instance.Add("数据", "数据值");
    var value1 = WebRequestObjectPool.Instance.Get("数据").As<string>();
    
    //通过扩展方法获取数据
    var value2 = WebRequestObjectPool.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环境都可以正常运行。
  • 相关阅读:
    BZOJ 1040 (ZJOI 2008) 骑士
    BZOJ 1037 (ZJOI 2008) 生日聚会
    ZJOI 2006 物流运输 bzoj1003
    ZJOI 2006 物流运输 bzoj1003
    NOI2001 炮兵阵地 洛谷2704
    NOI2001 炮兵阵地 洛谷2704
    JLOI 2013 卡牌游戏 bzoj3191
    JLOI 2013 卡牌游戏 bzoj3191
    Noip 2012 day2t1 同余方程
    bzoj 1191 [HNOI2006]超级英雄Hero——二分图匹配
  • 原文地址:https://www.cnblogs.com/kingthy/p/2135390.html
Copyright © 2011-2022 走看看