惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
有赞技术团队
有赞技术团队
博客园 - 叶小钗
博客园 - Franky
博客园_首页
S
SegmentFault 最新的问题
阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
罗磊的独立博客
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
B
Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
V
Visual Studio Blog
J
Java Code Geeks
D
Docker
Martin Fowler
Martin Fowler
Blog — PlanetScale
Blog — PlanetScale
腾讯CDC
The Register - Security
The Register - Security
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
The GitHub Blog
The GitHub Blog
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
博客园 - 【当耐特】
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Commits to openclaw:main
Recent Commits to openclaw:main
G
Google Developers Blog
S
Schneier on Security
Apple Machine Learning Research
Apple Machine Learning Research
AWS News Blog
AWS News Blog
N
Netflix TechBlog - Medium
量子位
爱范儿
爱范儿
D
Darknet – Hacking Tools, Hacker News & Cyber Security
MyScale Blog
MyScale Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Spread Privacy
Spread Privacy
V
Vulnerabilities – Threatpost
A
Arctic Wolf
C
Cisco Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
The Cloudflare Blog
C
CERT Recently Published Vulnerability Notes
L
LINUX DO - 最新话题
W
WeLiveSecurity
Hacker News: Ask HN
Hacker News: Ask HN

博客园 - Kingthy

【开源项目】智能电视及电视盒子的控制应用TVRemoteIME的接口说明 实现安卓里边下边播的播放器(源码公开) 现在很火的答题赢钱游戏,让我来简单教你怎么做自动答题器 【开源项目】电视盒子好用又强大的APP: TVRemoteIME [原创]用C#实现微信“跳一跳”小游戏的自动跳跃助手 javascript图片隐写术,感觉可以用它来干点有想法的事情 我的KT库之----与VT的结合 我的KT库之----数据库的操作(DbCommandBuilder/DbConditionBuilder) VTemplate模板引擎的使用—Function标签 我的KT库之----数据库的操作(DbCommandExecutor) 我的KT库之----数据库的操作(DbHelper) 我的KT库之----数据对象 【原创】腾讯微博的XSS攻击漏洞 我的KT库之-----缓存与配置 我的KT库之-----扩展方法 我的KT库之-----认识KT [开源]基于C#的腾讯微博SDK V0.1版本发布 怪异的StackOverflowException异常 开源的Kingthy.Mail邮件组件库
我的KT库之-----对象池
Kingthy · 2011-08-11 · via 博客园 - Kingthy

了解或者认识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环境都可以正常运行。