Пример #1
0
        public bool TryAdd(TKey key, TValue value)
        {
            if (key == null)
            {
                throw new ArgumentNullException("key");
            }
            var weakKey   = new WeakKeyReference <TKey>(key, _comparer);
            var weakValue = WeakReference <TValue> .Create(value);

            _removeWeakReferencesInNull();
            return(_dictionary.TryAdd(weakKey, weakValue));
        }
Пример #2
0
        public TValue GetOrAdd(TKey key, Func <object, TValue> valueFactory)
        {
            if (key == null)
            {
                throw new ArgumentNullException("key");
            }
            WeakReference <TKey> weakKey = new WeakKeyReference <TKey>(key, _comparer);

            _removeWeakReferencesInNull();
            var res = _dictionary.GetOrAdd(weakKey, mKey => WeakReference <TValue> .Create(valueFactory(mKey)));

            return(res.Target);
        }
Пример #3
0
        public TValue GetOrAdd(TKey key, Func <object, TValue> valueFactory)
        {
            if (key is null)
            {
                throw new ArgumentNullException(nameof(key));
            }
            var weakKey = new WeakKeyReference <TKey>(key, _comparer);

            _removeWeakReferencesInNull();
            WeakReference <TValue> res;

            while (true)
            {
                res = _dictionary.GetOrAdd(weakKey, (mKey, eKey) => WeakReference <TValue> .Create(valueFactory(eKey)), key);
                if (res.IsAlive)
                {
                    break;
                }
                _dictionary.TryRemove(weakKey, out _);
            }
            return(res.Target);
        }
Пример #4
0
        public bool TryAdd(TKey key, TValue value)
        {
            if (key is null)
            {
                throw new ArgumentNullException(nameof(key));
            }
            var weakKey = new WeakKeyReference <TKey>(key, _comparer);

            if (_dictionary.TryGetValue(weakKey, out var oValue))
            {
                if (!oValue.IsAlive)
                {
                    _dictionary.TryRemove(weakKey, out _);
                }
                else
                {
                    return(false);
                }
            }
            var weakValue = WeakReference <TValue> .Create(value);

            _removeWeakReferencesInNull();
            return(_dictionary.TryAdd(weakKey, weakValue));
        }
Пример #5
0
        protected override void SetValue(TKey key, TValue value)
        {
            var weakKey = new WeakKeyReference <TKey>(key, _comparer);

            _dictionary[weakKey] = WeakReference <TValue> .Create(value);
        }