【发布时间】:2008-10-01 14:36:52
【问题描述】:
通过从 IDictionary 派生并定义私有 SyncRoot 对象,我能够在 C# 中实现线程安全字典:
public class SafeDictionary<TKey, TValue>: IDictionary<TKey, TValue>
{
private readonly object syncRoot = new object();
private Dictionary<TKey, TValue> d = new Dictionary<TKey, TValue>();
public object SyncRoot
{
get { return syncRoot; }
}
public void Add(TKey key, TValue value)
{
lock (syncRoot)
{
d.Add(key, value);
}
}
// more IDictionary members...
}
然后我在整个消费者(多个线程)中锁定这个 SyncRoot 对象:
例子:
lock (m_MySharedDictionary.SyncRoot)
{
m_MySharedDictionary.Add(...);
}
我能够让它工作,但这导致了一些丑陋的代码。我的问题是,有没有更好、更优雅的方式来实现线程安全字典?
【问题讨论】:
-
你觉得它有什么难看的地方?
-
我认为他指的是他在 SharedDictionary 类的消费者中的整个代码中拥有的所有锁定语句——他每次访问方法时都会锁定 calling 代码一个 SharedDictionary 对象。
-
不要使用 Add 方法,而是尝试通过分配值 ex- m_MySharedDictionary["key1"]="item1",这是线程安全的。
标签: c# .net thread-safety collections