哈希表到 Dictionary<> syncroot 。

Posted

技术标签:

【中文标题】哈希表到 Dictionary<> syncroot 。【英文标题】:Hashtable to Dictionary<> syncroot . 【发布时间】:2010-09-24 13:37:23 【问题描述】:

哈希表具有同步根属性,但通用字典没有。如果我有这样做的代码:

lock (hashtable.Syncroot)

....

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

【问题讨论】:

【参考方案1】:

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

虽然扩展它。 SyncRoot 属性未直接添加到通用字典的原因是它是一种危险的同步方式。它只比非常危险且容易出现死锁的“lock(this)”好一点。这里有几个链接说明了为什么这是不好的。

http://blogs.msdn.com/bclteam/archive/2005/03/15/396399.aspx http://blogs.msdn.com/ricom/archive/2006/05/01/587750.aspx

【讨论】:

完全同意。然而,当人们回答“这很糟糕,不要这样做”时,我真的很讨厌它:)。大多数时候,人们提出一个问题,他们经常被困在一个特定的场景中,需要解决它。我会尝试就问题提供帮助,并就问题的原因以及如何避免问题提供建议。【参考方案2】:

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.

【讨论】:

您是否有来源引用表明这是原始设计中的错误? Brad Abrams 和 Krzysztof Cwalina(.NET 的项目经理)这样说:blogs.msdn.com/brada/archive/2003/09/28/50391.aspx Jeffrey Richter 还通过 C# 在 CLR 中介绍了此设计错误。【参考方案3】:

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

【讨论】:

【参考方案4】:
var dictionary = new Dictionary<int, string>();

lock(((ICollection) dictionary).SyncRoot)

    // ...

【讨论】:

以上是关于哈希表到 Dictionary<> syncroot 。的主要内容,如果未能解决你的问题,请参考以下文章

索引器哈希表Hashtabl字典Dictionary(转)

ConcurrentDictionary与Dictionary

Dictionary<TKey, TValue> 中的散列过程是如何工作的

HTML表到熊猫表:html标签内的信息

UVA - 10815 Andy's First Dictionary

安迪的第一个字典 (Andy's First Dictionary,UVa10815)