Hashtable to Dictionary<>同步。

时间:2008-11-29 16:06:30

标签: c# generics dictionary hashtable

Hashtables具有syncroot属性,但通用词典不具备。如果我有代码执行此操作:

lock (hashtable.Syncroot)
{
....
}

如果我删除哈希表并更改为通用词典,我该如何复制?

4 个答案:

答案 0 :(得分:12)

如果你严格要求兼容性,那么布莱恩是正确的。这是在Dictionary上维护当前语义的最佳方法。

虽然扩展了它。 SyncRoot属性未直接添加到通用字典的原因是它是一种执行同步的危险方式。它只比“锁定(这个)”更好,这是非常危险的并且容易出现死锁。以下是一些链接,说明为什么这很糟糕。

答案 1 :(得分:7)

SyncRoot背后的新思路是原始设计中的错误。如果要锁定的唯一内容是字典并且它是私有的,则可以将其锁定或用作同步对象的其他对象。当你保护的状态不仅仅是字典时,后一种技术很有用。

// used as you would have used SyncRoot before
object _syncLock = new object();
Dictionary<string, int> numberMapper = new Dictionary<string, int>();

// in some method...
lock (_syncLock)
{
    // use the dictionary here.
}

答案 2 :(得分:5)

var dictionary = new Dictionary<int, string>();

lock(((ICollection) dictionary).SyncRoot)
{
    // ...
}

答案 3 :(得分:3)

如果哈希表/字典不是公共的,您可以直接锁定字典对象。