• CacheEntryRemovedCallback


    
    #define cs4 //C# 4.0+
    //#define cs2 //C# 2.0+
    // /r:C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Runtime.Caching.dll
    namespace Test
    {
        using System;
    #if cs4
        using System.Runtime.Caching;
    #endif
        using System.Web;
        using System.Web.Caching;
        using System.Threading;
        using Microshaoft;
        public class Class1
        {
            static void Main(string[] args)
            {
                CacheItemEntryRemovedNotifier x = new CacheItemEntryRemovedNotifier("key1", 5);
                x.CacheItemEntryRemoved += new CacheItemEntryRemovedNotifier.CacheItemEntryRemovedEventHandler(x_CacheItemEntryRemoved);
                CacheItemEntryRemovedNotifier y = new CacheItemEntryRemovedNotifier("key2", 5);
                y.CacheItemEntryRemoved += new CacheItemEntryRemovedNotifier.CacheItemEntryRemovedEventHandler(x_CacheItemEntryRemoved);
                Thread.Sleep(2 * 1000);
                x.Remove();
                Console.WriteLine("Hello World");
                Console.WriteLine(Environment.Version.ToString());
                Console.ReadLine();
            }
            static void x_CacheItemEntryRemoved(CacheItemEntryRemovedNotifier sender, Enum reason)
            {
                if (reason is CacheItemRemovedReason)
                {
                    Console.WriteLine(Enum.GetName(typeof(CacheItemRemovedReason), (CacheItemRemovedReason) reason));
                }
    #if cs4
                else if (reason is CacheEntryRemovedReason)
                {
                    Console.WriteLine(Enum.GetName(typeof(CacheEntryRemovedReason), (CacheEntryRemovedReason) reason));
                }
    #endif
                Console.WriteLine(sender.Key);
                sender.ExpireSeconds = 10;
            }
        }
    }
    namespace Microshaoft
    {
        using System;
    #if cs4
        using System.Runtime.Caching;
    #elif cs2
        using System.Web;
        using System.Web.Caching;
    #endif
        using System.Threading;
        public class CacheItemEntryRemovedNotifier
        {
            public delegate void CacheItemEntryRemovedEventHandler
                                            (
                                                    CacheItemEntryRemovedNotifier sender
                                                    ,
    ///#if cs4
    ///                                                    CacheEntryRemovedReason
    ///#elif cs2
    ///                                                    CacheItemRemovedReason
    ///#endif
                                                        Enum
                                                        removedReason
                                             );
            public event CacheItemEntryRemovedEventHandler CacheItemEntryRemoved;
            private
    #if cs4
                        MemoryCache
    #elif cs2
                        Cache
    #endif
                                        _cache = null;
            private string _key;
            public string Key
            {
                get
                {
                    return _key;
                }
            }
            private uint _expireSeconds = 0;
            public uint ExpireSeconds
            {
                get
                {
                    return _expireSeconds;
                }
                set
                {
                    _expireSeconds = value;
                }
            }
            public CacheItemEntryRemovedNotifier(string key, uint expireSeconds)
            {
                _key = key;
    #if cs4
                _cache = MemoryCache.Default;
    #elif cs2
                HttpContext context = HttpContext.Current;
                if (context != null)
                {
                    _cache = context.Cache;
                }
                else
                {
                    _cache = HttpRuntime.Cache;
                }
    #endif
                Add(key, expireSeconds);
            }
            private void Add(string key, uint expireSeconds)
            {
    #if cs4
                CacheItem item = null;
                CacheItemPolicy cip = null;
                CacheEntryRemovedCallback removedCallback = null;
                _expireSeconds = expireSeconds;
                if (!_cache.Contains(key))
                {
                    //实例化一个CacheItem缓存项
                    item = new CacheItem(key, new object());
                    //实例化CacheItemPolicy 并关联缓存项的一组逐出和过期详细信息
                    cip = new CacheItemPolicy();
                    removedCallback = new CacheEntryRemovedCallback(CacheEntryRemovedCallbackProcess);
                    cip.RemovedCallback = removedCallback;
                    DateTime expire = DateTime.Now.AddSeconds(_expireSeconds);
                    cip.AbsoluteExpiration = new DateTimeOffset(expire);
                    //将缓存实例添加到系统缓存
                    _cache.Add(item, cip);
                }
    #elif cs2
                CacheItemRemovedCallback removedCallback = new CacheItemRemovedCallback(CacheItemRemovedCallbackProcess);
                _cache.Insert
                            (
                                key
                                , new object()
                                , null
                                , Cache.NoAbsoluteExpiration
                                , TimeSpan.FromSeconds(expireSeconds)
                                , CacheItemPriority.Normal
                                , removedCallback
                             );
    #endif
            }
            public void Start(uint expireSeconds)
            {
                _expireSeconds = expireSeconds;
                Add(_key, _expireSeconds);
            }
            public void Remove()
            {
                _cache.Remove(_key);
                //_expireSeconds = 0;
            }
            public void Stop()
            {
                _cache.Remove(_key);
                _expireSeconds = 0;
            }
    #if cs4
            private void CacheEntryRemovedCallbackProcess(CacheEntryRemovedArguments cera)
            {
                if (CacheItemEntryRemoved != null)
                {
                    CacheItemEntryRemoved(this, cera.RemovedReason);
                }
                if (_expireSeconds > 0)
                {
                    Add(_key, _expireSeconds);
                }
            }
    #elif cs2
            private void CacheItemRemovedCallbackProcess(string key, object cacheItem, CacheItemRemovedReason removedReason)
            {
                if (CacheItemEntryRemoved != null)
                {
                    CacheItemEntryRemoved(this, removedReason);
                }
                if (_expireSeconds > 0)
                {
                    Add(_key, _expireSeconds);
                }
            }
    #endif
        }
    }
    
    
  • 相关阅读:
    Unix网络编程中的五种IO模型
    go工具库分析——go-snowflake
    defer
    滑动窗口
    快速幂
    Golang使用注意点
    微服务数据一致性基础认知
    KMP算法
    单调栈和单调队列
    LRU简单学习
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/1889433.html
Copyright © 2020-2023  润新知