Безопасное добавление в Dictionary из разных тредов - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день! Многопоточное приложение. Мне нужно из разных потоков проверять ключ в Dictionary и заводить новые ключи. Подскажите, как это сделать безопасно для разных потоков и быстро? Я знаю про ConcurrentDictionary, но мне нужно именно под c# 2.0.

Решение задачи: «Безопасное добавление в Dictionary из разных тредов»

textual
Листинг программы
 public class ConcurrentDicitonary<TKey, TValue> : IDictionary<TKey, TValue>
    {
        private readonly Dictionary<TKey, TValue> _dict = new Dictionary<TKey, TValue>();
        private readonly object _syncroot = new object();
 
        public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
        {
            lock (_syncroot)
            {
                return _dict.GetEnumerator();
            }
        }
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
 
        public void Add(KeyValuePair<TKey, TValue> item)
        {
            Add(item.Key, item.Value);
        }
 
 
        public void Clear()
        {
            lock (_syncroot)
            {
                _dict.Clear();
            }
        }
 
        public bool Contains(KeyValuePair<TKey, TValue> item)
        {
            lock (_syncroot)
            {
                return _dict.Contains(item);
            }
        }
 
        void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
        {
            lock (_syncroot)
            {
                ((IDictionary<TKey, TValue>) _dict).CopyTo(array, arrayIndex);
            }
        }
 
        public bool Remove(KeyValuePair<TKey, TValue> item)
        {
            return Remove(item.Key);
        }
 
        public int Count
        {
            get { return _dict.Count; }
        }
 
        bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly
        {
            get { return ((IDictionary<TKey, TValue>) _dict).IsReadOnly; }
        }
 
        public bool ContainsKey(TKey key)
        {
            lock (_syncroot)
            {
                return _dict.ContainsKey(key);
            }
        }
 
        public void Add(TKey key, TValue value)
        {
            lock (_syncroot)
            {
                _dict.Add(key, value);
            }
        }
 
        public bool Remove(TKey key)
        {
            lock (_syncroot)
            {
                return _dict.Remove(key);
            }
        }
 
        public bool TryGetValue(TKey key, out TValue value)
        {
            lock (_syncroot)
            {
                return _dict.TryGetValue(key, out value);
            }
        }
 
        public TValue this[TKey key]
        {
            get
            {
                lock (_syncroot)
                {
                    return _dict[key];
                }
            }
            set
            {
                lock (_syncroot)
                {
                    _dict[key] = value;
                }
            }
        }
 
        public ICollection<TKey> Keys
        {
            get
            {
                lock (_syncroot)
                {
                    return _dict.Keys;
                }
            }
        }
 
        public ICollection<TValue> Values
        {
            get
            {
                lock (_syncroot)
                {
                    return _dict.Values;
                }
            }
        }
    }

Оцени полезность:

6   голосов , оценка 3.667 из 5
Похожие ответы