哈希表具有同步根属性,但通用字典没有。如果我有执行此操作的代码:

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

如果我要删除哈希表并更改为通用字典,如何复制此内容?

有帮助吗?

解决方案

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

但在此基础上进行扩展。SyncRoot 属性未直接添加到通用字典的原因是,这是一种危险的同步方式。它只比“lock(this)”好一点点,“lock(this)”非常危险并且容易出现死锁。这里有几个链接可以解释为什么这很糟糕。

其他提示

背后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.
}
var dictionary = new Dictionary<int, string>();

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

如果哈希表/字典是不公开的,你可以只锁定字典对象本身。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top