using System; using System.Runtime.Caching; namespace MemoryCacheHelpSpace { public static class MemoryCacheHelp { private static Object m_objLocker = new object(); public static T GetCacheItem<T>(String strKey, Func<T> cachePopulate, TimeSpan? slidingExpiration = null, DateTime? absoluteExpiration = null) { if (string.IsNullOrWhiteSpace(strKey)) throw new ArgumentException("无效键"); if (cachePopulate == null) throw new ArgumentException("委托不能为null"); if (slidingExpiration == null && absoluteExpiration == null) throw new ArgumentException("间隔或时间至少有一个"); if (MemoryCache.Default[strKey] == null) { lock (m_objLocker) { var item = new CacheItem(strKey, cachePopulate()); var policy = CreatePolicy(slidingExpiration, absoluteExpiration); MemoryCache.Default.Add(item, policy); } } return (T)MemoryCache.Default[strKey]; } public static void CacheRemove(string strKey) { if (string.IsNullOrWhiteSpace(strKey)) throw new ArgumentException("无效键"); if (MemoryCache.Default[strKey] != null) { lock (m_objLocker) { MemoryCache.Default.Remove(strKey); } } } private static CacheItemPolicy CreatePolicy(TimeSpan? slidingExpiration, DateTime? absoluteExpiration) { var policy = new CacheItemPolicy(); if (absoluteExpiration.HasValue) { policy.AbsoluteExpiration = absoluteExpiration.Value; } else if (slidingExpiration.HasValue) { policy.SlidingExpiration = slidingExpiration.Value; } policy.Priority = CacheItemPriority.Default; return policy; } } }