public static class Cache { private static readonly Timer CleanupTimer = new Timer() { AutoReset=true,Enabled=true,Interval=60000 }; private static readonly Dictionary<string,CacheItem> InternalCache = new Dictionary<string,CacheItem>(); static Cache() { CleanupTimer.Elapsed+=Clean; CleanupTimer.Start(); } private static void Clean(object sender,ElapsedEventArgs e) { InternalCache.Keys.ToList().ForEach(x => { try { if(InternalCache[x].ExpireTime<=e.SignalTime) { Remove(x); } } catch(Exception) { /*swallow it*/ } }); } public static bool ContainsKey(string key) { return InternalCache.ContainsKey(key); } public static T Get<T>(string key,int expiresMinutes,Func<T> refreshFunction) { if(InternalCache.ContainsKey(key)&&InternalCache[key].ExpireTime>DateTime.Now) { return (T)InternalCache[key].Item; } var result = refreshFunction(); Set(key,result,expiresMinutes); return result; } public static void Set(string key,object item,int expiresMinutes) { Remove(key); InternalCache.Add(key,new CacheItem(item,expiresMinutes)); } public static void Remove(string key) { if(InternalCache.ContainsKey(key)) { InternalCache.Remove(key); } } private struct CacheItem { public CacheItem(object item,int expiresMinutes) : this() { Item=item; ExpireTime=DateTime.Now.AddMinutes(expiresMinutes); } public object Item { get; private set; } public DateTime ExpireTime { get; private set; } } }