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
    }
}

原文地址:https://www.cnblogs.com/Microshaoft/p/1889433.html