2008-11-29 13 views
10

Hashtables haben eine Syncroot-Eigenschaft, aber allgemeine Wörterbücher nicht. Wenn ich Code, der tut dies:Hashtable zu Dictionary <> syncroot.

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

Wie replizieren ich das, wenn ich die hashtable bin zu entfernen und zu ändern, um allgemeine Wörterbücher?

Antwort

10

Wenn Sie ausschließlich für die Kompatibilität gehen, dann ist Bryan korrekt. Dies ist der beste Weg, um Ihre aktuelle Semantik über ein Dictionary zu halten.

Erweitern Sie es jedoch. Der Grund, warum die SyncRoot-Eigenschaft nicht direkt zum generischen Wörterbuch hinzugefügt wurde, ist, dass es eine gefährliche Art ist, eine Synchronisation durchzuführen. Es ist nur geringfügig besser als "lock (this)", was sehr gefährlich und anfällig für Deadlocks ist. Hier sind ein paar Links, die erklären, warum das schlecht ist.

+0

d. H. Tun Sie das nicht. – Will

+5

Stimme voll und ganz zu. Aber ich hasse es wirklich, wenn Leute antworten mit "das ist schlecht, tu es nicht" :). Die meiste Zeit stellen die Leute eine Frage, die sie oft in einem bestimmten Szenario stecken und durcharbeiten müssen. Ich versuche, bei dem Problem Hilfe und Ratschläge zu geben, warum es schlecht ist und wie man es vermeidet. – JaredPar

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

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

Wenn die Hashtabelle/das Wörterbuch nicht öffentlich ist, können Sie das Wörterbuchobjekt selbst sperren.

7

Der neue Gedanke hinter SyncRoot ist, dass es ein Fehler im ursprünglichen Design war. Wenn das Wörterbuch nur gesperrt ist und es privat ist, können Sie es oder ein anderes Objekt, das als Synchronisierungsobjekt dient, sperren. Die letztere Technik ist nützlich, wenn der zu schützende Zustand mehr ist als nur das Wörterbuch.

// 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

Haben Sie eine Quelle Zitat auf haben, dass es ein Fehler in dem ursprünglichen Entwurf war? – dalle

+1

Brad Abrams und Krzysztof Cwalina (Programm-Manager von .NET) sagt so: http://blogs.msdn.com/brada/archive/2003/09/28/50391.aspx – netadictos

+0

Jeffrey Richter deckt auch diesen Fehler im Design in CLR Über C#. – Will

Verwandte Themen