2008-11-29 82 views
10

哈希表具有syncroot屬性,但通用字典不具有。如果我有代碼,這是否:Hashtable to Dictionary <> syncroot。

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

如何複製這一點,如果我刪除了哈希表並改變通用詞典?

回答

10

如果你要嚴格地兼容,那麼布賴恩是正確的。這是在Dictionary上維護當前語義的最佳方法。

雖然擴展它。 SyncRoot屬性沒有直接添加到通用字典中的原因是這是執行同步的一種危險方式。它只比「鎖(這個)」略好,這是非常危險的,並且容易出現死鎖。這裏有幾個鏈接說明爲什麼這是糟糕的。

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

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

如果散列表/字典不公開,您可以鎖定字典對象本身。

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. 
} 
+0

你有一個源報價上,它是在原設計中的錯誤呢? – dalle 2008-11-29 17:53:36

+1

Brad Abrams和Krzysztof Cwalina(.NET程序管理員)這樣說:http://blogs.msdn.com/brada/archive/2003/09/28/50391.aspx – netadictos 2008-11-29 18:14:19

相關問題