Hashtable to Dictionary <> syncroot.

leo*_*ora 11 c# generics dictionary hashtable

Hashtables有一个syncroot属性,但通用词典没有.如果我有代码执行此操作:

lock (hashtable.Syncroot)
{
....
}
Run Code Online (Sandbox Code Playgroud)

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

Jar*_*Par 12

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

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

  • 完全同意.然而,当人们回答"这很糟糕,不要这样做"时,我真的很讨厌它.大多数时候,人们会问一个问题,他们经常被困在一个特定的场景中,需要解决它.我试着帮助解决这个问题,并就如何解决这个问题提出建议. (6认同)

den*_*ips 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.
}
Run Code Online (Sandbox Code Playgroud)


Bry*_*tts 5

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

lock(((ICollection) dictionary).SyncRoot)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)