using CYQ.Data.Table; using System; using System.Collections; using System.Collections.Generic; using System.Data.Common; using System.Runtime.Serialization; using System.Text; using System.Threading; namespace CYQ.Data.Tool { /// /// 线程安全字典类 /// /// key /// value public partial class MDictionary : Dictionary { private ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); public MDictionary() : base() { } public MDictionary(IEqualityComparer comparer) : base(comparer) { } public MDictionary(int capacity) : base(capacity) { } public MDictionary(int capacity, IEqualityComparer comparer) : base(capacity, comparer) { } /// /// 添加值(带锁)【不存则,则添加;存在,则忽略】 /// public new void Add(K key, V value) { _lock.TryEnterWriteLock(Timeout.Infinite); try { if (!ContainsKey(key)) { base.Add(key, value); } } finally { _lock.ExitWriteLock(); } } /// /// 移除(带锁) /// /// /// public new bool Remove(K key) { _lock.TryEnterWriteLock(Timeout.Infinite); try { return base.Remove(key); } finally { _lock.ExitWriteLock(); } } /// /// 索引取值(带锁) /// /// /// public new V this[K key] { get { _lock.TryEnterReadLock(Timeout.Infinite); try { if (base.ContainsKey(key)) { return base[key]; } return default(V); } finally { _lock.ExitReadLock(); } } set { _lock.TryEnterWriteLock(Timeout.Infinite); try { if (base.ContainsKey(key)) { base[key] = value; } } finally { _lock.ExitWriteLock(); } } } /// /// 通过index索引取值(带锁) /// /// public V this[int index] { get { _lock.TryEnterReadLock(Timeout.Infinite); try { if (index >= 0 && index < this.Count) { int i = 0; foreach (V value in this.Values) { if (i == index) { return value; } i++; } } else // 兼容存档hash int { K key = ConvertTool.ChangeType(index); if (base.ContainsKey(key)) { return base[key]; } } return default(V); } finally { _lock.ExitReadLock(); } } set { _lock.TryEnterWriteLock(Timeout.Infinite); try { if (index >= 0 && index < this.Count) { int i = 0; foreach (K key in this.Keys) { if (i == index) { this[key] = value; break; } i++; } } else { K key = ConvertTool.ChangeType(index); base[key] = value; } } finally { _lock.ExitWriteLock(); } } } /// /// 当Key为int时,通过此方法取值(带锁) /// /// /// public V Get(K key) { _lock.TryEnterReadLock(Timeout.Infinite); try { if (base.ContainsKey(key)) { return base[key]; } return default(V); } finally { _lock.ExitReadLock(); } } /// /// 检查值存在【则更新】,不存在则添加(带锁) /// public void Set(K key, V value) { _lock.TryEnterWriteLock(Timeout.Infinite); try { if (base.ContainsKey(key)) { base[key] = value; } else { base.Add(key, value); } } finally { _lock.ExitWriteLock(); } } /// /// 清空数据(带锁) /// public new void Clear() { _lock.TryEnterWriteLock(Timeout.Infinite); try { if (base.Count > 0) { base.Clear(); } } finally { _lock.ExitWriteLock(); } } public new bool ContainsKey(K key) { if (key == null || base.Count == 0) { return false; } return base.ContainsKey(key); } /// /// 获取键列表(带锁) /// public List GetKeys() { _lock.TryEnterReadLock(Timeout.Infinite); try { List keys = new List(base.Keys.Count); foreach (K item in base.Keys) { keys.Add(item); } return keys; } finally { _lock.ExitReadLock(); } } /// /// 获取值列表(带锁) /// public List GetValues() { _lock.TryEnterReadLock(Timeout.Infinite); try { List values = new List(base.Values.Count); foreach (V item in base.Values) { values.Add(item); } return values; } finally { _lock.ExitReadLock(); } } } [Serializable] public partial class MDictionary { protected MDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { } } }