private void removeLock(TKey key, AntiDupLockSlim slim) { _slimLock.EnterWriteLock(); try { slim.UseCount--; if (slim.UseCount == 0) { _lockDict.Remove(key); slim.Dispose(); } } finally { _slimLock.ExitWriteLock(); } }
private AntiDupLockSlim addLock(TKey key) { AntiDupLockSlim slim; _slimLock.EnterWriteLock(); try { if (_lockDict.TryGetValue(key, out slim) == false) { slim = new AntiDupLockSlim(); _lockDict[key] = slim; } slim.UseCount++; } finally { _slimLock.ExitWriteLock(); } return(slim); }
/// <summary> /// 执行 /// </summary> /// <param name="key">值</param> /// <param name="factory">执行方法</param> /// <returns></returns> public TValue Execute(TKey key, Func <TValue> factory) { // 过期时间为0 则不缓存 if (object.Equals(null, key) || _expireTicks == 0L || _maxCount == 0) { return(factory()); } Tuple <long, TValue> tuple; long lastTicks; _lock.EnterReadLock(); try { if (_map.TryGetValue(key, out tuple)) { if (_expireTicks == -1) { return(tuple.Item2); } if (tuple.Item1 + _expireTicks > DateTime.Now.Ticks) { return(tuple.Item2); } } lastTicks = _lastTicks; } finally { _lock.ExitReadLock(); } AntiDupLockSlim slim; _slimLock.EnterUpgradeableReadLock(); try { _lock.EnterReadLock(); try { if (_lastTicks != lastTicks) { if (_map.TryGetValue(key, out tuple)) { if (_expireTicks == -1) { return(tuple.Item2); } if (tuple.Item1 + _expireTicks > DateTime.Now.Ticks) { return(tuple.Item2); } } lastTicks = _lastTicks; } } finally { _lock.ExitReadLock(); } _slimLock.EnterWriteLock(); try { if (_lockDict.TryGetValue(key, out slim) == false) { slim = new AntiDupLockSlim(); _lockDict[key] = slim; } slim.UseCount++; } finally { _slimLock.ExitWriteLock(); } } finally { _slimLock.ExitUpgradeableReadLock(); } slim.EnterWriteLock(); try { _lock.EnterReadLock(); try { if (_lastTicks != lastTicks && _map.TryGetValue(key, out tuple)) { if (_expireTicks == -1) { return(tuple.Item2); } if (tuple.Item1 + _expireTicks > DateTime.Now.Ticks) { return(tuple.Item2); } } } finally { _lock.ExitReadLock(); } var val = factory(); _lock.EnterWriteLock(); try { _lastTicks = DateTime.Now.Ticks; _map[key] = Tuple.Create(_lastTicks, val); if (_maxCount > 0) { if (_queue.Contains(key) == false) { _queue.Enqueue(key); if (_queue.Count > _maxCount) { _map.Remove(_queue.Dequeue()); } } } } finally { _lock.ExitWriteLock(); } return(val); } finally { slim.ExitWriteLock(); _slimLock.EnterWriteLock(); try { slim.UseCount--; if (slim.UseCount == 0) { _lockDict.Remove(key); slim.Dispose(); } } finally { _slimLock.ExitWriteLock(); } } }
/// <summary> /// 执行 /// </summary> /// <param name="key">值</param> /// <param name="factory">执行方法</param> /// <returns></returns> public TValue Execute(TKey key, Func <TValue> factory) { // 过期时间为0 则不缓存 if (object.Equals(null, key) || _maxCount == 0) { return(factory()); } _lock.EnterReadLock(); TValue tuple; long lastTicks; try { if (_map.TryGetValue(key, out tuple)) { return(tuple); } lastTicks = _lastTicks; } finally { _lock.ExitReadLock(); } AntiDupLockSlim slim; _slimLock.EnterUpgradeableReadLock(); try { _lock.EnterReadLock(); try { if (_lastTicks != lastTicks) { if (_map.TryGetValue(key, out tuple)) { return(tuple); } lastTicks = _lastTicks; } } finally { _lock.ExitReadLock(); } _slimLock.EnterWriteLock(); try { if (_lockDict.TryGetValue(key, out slim) == false) { slim = new AntiDupLockSlim(); _lockDict[key] = slim; } slim.UseCount++; } finally { _slimLock.ExitWriteLock(); } } finally { _slimLock.ExitUpgradeableReadLock(); } slim.EnterWriteLock(); try { _lock.EnterReadLock(); try { if (_lastTicks != lastTicks && _map.TryGetValue(key, out tuple)) { return(tuple); } } finally { _lock.ExitReadLock(); } var val = factory(); _lock.EnterWriteLock(); try { _map[key] = val; _queue.Enqueue(key); if (_queue.Count > _maxCount) { var oldKey = _queue.Dequeue(); _map.Remove(oldKey); } } finally { _lock.ExitWriteLock(); } return(val); } finally { slim.ExitWriteLock(); _slimLock.EnterWriteLock(); try { slim.UseCount--; if (slim.UseCount == 0) { _lockDict.Remove(key); slim.Dispose(); } } finally { _slimLock.ExitWriteLock(); } } }
/// <summary> /// 执行 /// </summary> /// <param name="key"></param> /// <param name="factory"></param> /// <returns></returns> public TValue Execute(TKey key, Func <TValue> factory) { if (object.Equals(key, null)) { return(factory()); } long lastTicks; TValue val; _lock.EnterReadLock(); try { if (_map.TryGetValue(key, out val)) { return(val); } lastTicks = _lastTicks; } finally { _lock.ExitReadLock(); } AntiDupLockSlim slim; _slimLock.EnterUpgradeableReadLock(); try { _lock.EnterReadLock(); try { if (_lastTicks != lastTicks) { if (_map.TryGetValue(key, out val)) { return(val); } lastTicks = _lastTicks; } } finally { _lock.ExitReadLock(); } _slimLock.EnterWriteLock(); try { if (_lockDict.TryGetValue(key, out slim) == false) { slim = new AntiDupLockSlim(); _lockDict[key] = slim; } slim.UseCount++; } finally { _slimLock.ExitWriteLock(); } } finally { _slimLock.ExitUpgradeableReadLock(); } slim.EnterWriteLock(); try { _lock.EnterReadLock(); try { if (_lastTicks != lastTicks && _map.TryGetValue(key, out val)) { return(val); } } finally { _lock.ExitReadLock(); } val = factory(); _lock.EnterWriteLock(); try { _lastTicks = DateTime.Now.Ticks; _map[key] = val; } finally { _lock.ExitWriteLock(); } return(val); } finally { slim.ExitWriteLock(); _slimLock.EnterWriteLock(); try { slim.UseCount--; if (slim.UseCount == 0) { _lockDict.Remove(key); slim.Dispose(); } } finally { _slimLock.ExitWriteLock(); } } }