Безопасное добавление в 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; } } } }