哈希表具有同步根属性,但通用字典没有。如果我有这样做的代码:
lock (hashtable.Syncroot)
{
....
}
如果我要删除哈希表并更改为通用字典,我该如何复制它?
哈希表具有同步根属性,但通用字典没有。如果我有这样做的代码:
lock (hashtable.Syncroot)
{
....
}
如果我要删除哈希表并更改为通用字典,我该如何复制它?
如果您严格要求兼容性,那么 Bryan 是正确的。这是在字典之上维护当前语义的最佳方式。
虽然扩展它。SyncRoot 属性未直接添加到通用字典的原因是它是一种危险的同步方式。它只比非常危险且容易出现死锁的“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)
{
// ...
}
如果哈希表/字典不是公开的,您可以锁定字典对象本身。