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