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)
{
}
}
}