/// <summary> /// /// </summary> /// <param name="key"></param> /// <param name="method"></param> /// <returns></returns> public override object GetItem(string key, StorageBase.ComputeItemMethod method) { long index = (uint)key.GetHashCode() % ItemsList.Length; var items = ItemsList[index]; DateTime now = DateTime.Now; lock (items) { DictionaryValue item; if (!items.TryGetValue(key, out item) || item.ExpirationTime <= now) { DateTime expiration; item = new DictionaryValue() { Value = method(out expiration), ExpirationTime = expiration }; if (expiration > now) // item can be added into the cache { items[key] = item; } // update DictionaryInfo DictionaryInfo info = ItemsListInfo[index]; if (expiration < info.MinExpirationTime) { info.MinExpirationTime = expiration; } // check some other items for expiration if (info.MinExpirationTime < now && // some items expired info.LastCheck < now.AddMinutes(-CleanupsIntervalMinutes)) // interval between cleanups { RemoveExpired(items, info); } } return(item.Value); } }
public override object GetItem(string key, StorageBase.ComputeItemMethod method) { DateTime expiration; return(method(out expiration)); }