Exemplo n.º 1
0
 private void removeLock(TKey key, AntiDupLockSlim slim)
 {
     _slimLock.EnterWriteLock();
     try {
         slim.UseCount--;
         if (slim.UseCount == 0)
         {
             _lockDict.Remove(key);
             slim.Dispose();
         }
     } finally { _slimLock.ExitWriteLock(); }
 }
Exemplo n.º 2
0
        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(); }
            }
        }
Exemplo n.º 5
0
        /// <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(); }
            }
        }