public ExpireMemoryCache(TimeSpan expireTime) { this.ExpireTime = expireTime; _callback = GuidExpireCallback.Create(delegate { if (!_state) { _lock.EnterReadLock(); List <TKey> list = new List <TKey>(); foreach (var item in _map) { if (item.Value.Expire) { if (OnClearExpire != null) { OnClearExpire(this, new ClearExpireEventArgs <TValue>(item.Value.Item)); } list.Add(item.Key); } } _lock.ExitReadLock(); _lock.EnterWriteLock(); foreach (var item in list) { _map.Remove(item); } _lock.ExitWriteLock(); } }); CacheFactory.AddCallback(_callback); }
internal static void AddCallback(IExpireCallback callback) { lock (lockObj) { int count = _callbacks.Count; _callbacks.AddOrUpdate(callback.Key, callback.Callback, (k, a) => callback.Callback); if (count == 0 && _callbacks.Count > count) { ResetTimer(); } } }
internal static void RemoveCallback(IExpireCallback callback) { lock (lockObj) { int count = _callbacks.Count; Action tempCallback; _callbacks.TryRemove(callback.Key, out tempCallback); if (count > 0 && _callbacks.Count == 0) { ResetTimer(); } } }