using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Web; namespace Utils { public class SynchronisedDictionary : IDictionary { private Dictionary innerDict; private ReaderWriterLockSlim readWriteLock; public SynchronisedDictionary(Dictionary dic) { this.readWriteLock = new ReaderWriterLockSlim(); this.innerDict = dic ?? new Dictionary(); } public SynchronisedDictionary(Func getKey, List list) { this.readWriteLock = new ReaderWriterLockSlim(); this.innerDict = new Dictionary(); if (list != null && list.Count > 0) { foreach (var item in list) { var key = getKey(item); if (this.innerDict.ContainsKey(key)) { this.innerDict[key] = item; } else { this.innerDict.Add(getKey(item), item); } } } } /// /// 通过KeyValuePair新增缓存(建议使用SyncCache方法) /// /// KeyValuePair键值对 public void Add(KeyValuePair item) { using (new AcquireWriteLock(this.readWriteLock)) { this.innerDict[item.Key] = item.Value; } } /// /// 根据Key,Value新增缓存(建议使用SyncCache方法) /// /// 缓存键 /// 缓存值 public void Add(TKey key, TValue value) { using (new AcquireWriteLock(this.readWriteLock)) { this.innerDict[key] = value; } } /// /// 清空所有缓存 /// public void Clear() { using (new AcquireWriteLock(this.readWriteLock)) { this.innerDict.Clear(); } } /// /// 是否包含指定元素 /// /// KeyValuePair键值对 /// public bool Contains(KeyValuePair item) { using (new AcquireReadLock(this.readWriteLock)) { return this.innerDict.Contains>(item); } } /// /// 是否包含指定的键 /// /// /// public bool ContainsKey(TKey key) { using (new AcquireReadLock(this.readWriteLock)) { return this.innerDict.ContainsKey(key); } } /// /// copy到指定Array中 /// /// /// public void CopyTo(KeyValuePair[] array, int arrayIndex) { using (new AcquireReadLock(this.readWriteLock)) { this.innerDict.ToArray>().CopyTo(array, arrayIndex); } } /// /// 获取枚举数 /// /// public IEnumerator GetEnumerator() { using (new AcquireReadLock(this.readWriteLock)) { return this.innerDict.GetEnumerator(); } } IEnumerator> IEnumerable>.GetEnumerator() { using (new AcquireReadLock(this.readWriteLock)) { return this.innerDict.GetEnumerator(); } } /// /// 移除缓存(建议使用SyncCache方法) /// /// /// public bool Remove(TKey key) { bool isRemoved; using (new AcquireWriteLock(this.readWriteLock)) { isRemoved = this.innerDict.Remove(key); } return isRemoved; } /// /// 移除缓存(建议使用SyncCache方法) /// /// /// public bool Remove(KeyValuePair item) { using (new AcquireWriteLock(this.readWriteLock)) { return this.innerDict.Remove(item.Key); } } /// /// 获取缓存 /// /// 缓存键 /// 缓存值 /// public bool TryGetValue(TKey key, out TValue value) { using (new AcquireReadLock(this.readWriteLock)) { return this.innerDict.TryGetValue(key, out value); } } public int Count { get { using (new AcquireReadLock(this.readWriteLock)) { return this.innerDict.Count; } } } public bool IsReadOnly { get { return false; } } public TValue this[TKey key] { get { using (new AcquireReadLock(this.readWriteLock)) { return this.innerDict[key]; } } set { using (new AcquireWriteLock(this.readWriteLock)) { this.innerDict[key] = value; } } } public ICollection Keys { get { using (new AcquireReadLock(this.readWriteLock)) { return this.innerDict.Keys; } } } public ICollection Values { get { using (new AcquireReadLock(this.readWriteLock)) { return this.innerDict.Values; } } } /// /// 同步缓存 /// /// 缓存键 /// 缓存值 /// 是否删除 /// /// 新增:SyncCache(Id,Value,false) /// 修改:SyncCache(Id,Value,false) /// 删除:SyncCache(Id,null,true) /// public void SyncCache(TKey key, TValue value, bool del) { if (del) { Remove(key); } else { this[key] = value; } } } public class SynchronisedList : IList { private List innerList; private ReaderWriterLockSlim readWriteLock; public SynchronisedList(IEnumerable list) { innerList = new List(); readWriteLock = new ReaderWriterLockSlim(); if (list != null && list.Count() > 0) { this.innerList.AddRange(list); } } public int IndexOf(TValue item) { using (new AcquireReadLock(this.readWriteLock)) { return innerList.IndexOf(item); } } public void Insert(int index, TValue item) { using (new AcquireWriteLock(this.readWriteLock)) { innerList.Insert(index, item); } } public void RemoveAt(int index) { using (new AcquireWriteLock(this.readWriteLock)) { innerList.RemoveAt(index); } } public TValue this[int index] { get { using (new AcquireReadLock(this.readWriteLock)) { return innerList[index]; } } set { using (new AcquireWriteLock(this.readWriteLock)) { innerList[index] = value; } } } public void Add(TValue item) { using (new AcquireWriteLock(this.readWriteLock)) { innerList.Add(item); } } public void Clear() { using (new AcquireWriteLock(this.readWriteLock)) { innerList.Clear(); } } public bool Contains(TValue item) { using (new AcquireReadLock(this.readWriteLock)) { return innerList.Contains(item); } } public void CopyTo(TValue[] array, int arrayIndex) { using (new AcquireReadLock(this.readWriteLock)) { innerList.CopyTo(array, arrayIndex); } } public int Count { get { using (new AcquireReadLock(this.readWriteLock)) { return innerList.Count; } } } public bool IsReadOnly { get { return false; } } public bool Remove(TValue item) { using (new AcquireWriteLock(this.readWriteLock)) { return innerList.Remove(item); } } public IEnumerator GetEnumerator() { using (new AcquireReadLock(this.readWriteLock)) { return innerList.GetEnumerator(); } } IEnumerator IEnumerable.GetEnumerator() { using (new AcquireReadLock(this.readWriteLock)) { return innerList.GetEnumerator(); } } } class AcquireReadLock : IDisposable { private ReaderWriterLockSlim rwLock; private bool disposedValue; public AcquireReadLock(ReaderWriterLockSlim rwLock) { this.rwLock = new ReaderWriterLockSlim(); this.disposedValue = false; this.rwLock = rwLock; this.rwLock.EnterReadLock(); } public void Dispose() { this.Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!this.disposedValue && disposing) { this.rwLock.ExitReadLock(); } this.disposedValue = true; } } class AcquireWriteLock : IDisposable { private ReaderWriterLockSlim rwLock; private bool disposedValue; public AcquireWriteLock(ReaderWriterLockSlim rwLock) { this.rwLock = new ReaderWriterLockSlim(); this.disposedValue = false; this.rwLock = rwLock; this.rwLock.EnterWriteLock(); } public void Dispose() { this.Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!this.disposedValue && disposing) { this.rwLock.ExitWriteLock(); } this.disposedValue = true; } } }