Hashtable to Dictionary syncroot。

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

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

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

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

尽管如此,还是要扩展它。 SyncRoot属性未直接添加到通用字典的原因是它是一种执行同步的危险方式。 它只比“锁定(这个)”更好,这非常危险,容易出现死锁。 这里有几个链接,说明为什么这是坏事。

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

 // used as you would have used SyncRoot before object _syncLock = new object(); Dictionary numberMapper = new Dictionary(); // in some method... lock (_syncLock) { // use the dictionary here. } 
 var dictionary = new Dictionary(); lock(((ICollection) dictionary).SyncRoot) { // ... } 

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