public void AddOrUpdate(TKey key, TValue value) { _lock.EnterReadLock(); IExpireItem <TValue> val; try { if (_map.TryGetValue(key, out val)) { val.ResetExpire(); val.Item = value; } else { val = new ExpireItem <TValue>(); val.ExpireTime = this.ExpireTime; val.Async = this.Async; if (OnExpire != null) { val.OnExpire += Val_OnExpire; } val.Item = value; // Store it _map.Add(key, val); } } finally { _lock.ExitReadLock(); } }
public bool Add(TKey key, TValue value) { _lock.EnterReadLock(); IExpireItem <TValue> val; try { if (_map.TryGetValue(key, out val)) { return(false); } val = new ExpireItem <TValue>(); val.ExpireTime = this.ExpireTime; val.Async = this.Async; if (OnExpire != null) { val.OnExpire += Val_OnExpire; } val.Item = value; // Store it _map.Add(key, val); return(true); } finally { _lock.ExitReadLock(); } }
public TValue Get(TKey key, Func <TValue> factory) { // Check cache _lock.EnterReadLock(); _state = true; IExpireItem <TValue> val; try { if (_map.TryGetValue(key, out val) && !val.Expire) { return(val.Item); } } finally { _lock.ExitReadLock(); _state = false; } // Cache it _lock.EnterWriteLock(); _state = true; try { // Check again if (_map.TryGetValue(key, out val) && !val.Expire) { return(val.Item); } if (val == null) { // Create it val = new ExpireItem <TValue>(); val.ExpireTime = this.ExpireTime; val.Async = this.Async; if (OnExpire != null) { val.OnExpire += Val_OnExpire; } val.Item = factory(); // Store it _map.Add(key, val); } else { // Change it val.Item = factory(); } // Done return(val.Item); } finally { _lock.ExitWriteLock(); _state = false; } }