2009-04-29 3 views
1

Lesen msdn documentation für Wörterbücher heißt es: "Öffentliche statische (Shared in Visual Basic) Mitglieder dieses Typs sind threadsicher. Alle Instanzmitglieder sind nicht garantiert threadsicher."Statisches Wörterbuch in .Net Thread-Sicherheit

dies mit einem Wörterbuch bedeuten diejenigen, die wie folgt aus:


static object syncObject = new object(); 
static Dictionary<string,MyObject> mydictionary= new Dictionary<string, MyObject>(); 

Ist unten unnötig etwas wie den Code zu tun?


lock (syncObject) 
{ 
    context = new TDataContext(); 
    mydictionary.Add("key", myObject); 
} 

Antwort

7

Es bezieht sich auf statische Methoden auf der Klasse selbst. Die Anweisung ist tatsächlich eine Standarddokumentation, die den meisten Klassen hinzugefügt wurde. Die Dictionary-Klasse <> stellt tatsächlich keine statischen Methoden zur Verfügung.

Sie müssen den Zugriff auf Ihre Wörterbuchklasse mit dem Schlüsselwort lock oder einem ReaderWriterLock selbst serialisieren. Threading ist jedoch ein ziemlich komplexes Thema und das Schlüsselwort lock ist nicht immer geeignet. Es gibt ein großartiges Buch von Joe Duffy "Concurrent Programming on Windows", das sehr ausführlich auf den Schutz von Ressourcen für gemeinsam genutzte Anwendungen eingeht.

1

Wenn Sie die Add-Methode (eine Instanzmethode) aufrufen, sollten Sie sicherstellen, dass Sie exklusiven Zugriff auf das Dictionary haben, indem Sie Ihre eigene Sperr- oder Serialisierungssemantik verwenden. Schlechte Dinge können auftreten, wenn zwei Threads gleichzeitig den Zustand Ihres Wörterbuchs ändern, und es liegt in Ihrer Verantwortung sicherzustellen, dass dies nicht geschieht. Es gibt nichts in der Add-Methode des Dictionary, das diese Sperre für Sie übernimmt.

Wenn Sie jedoch eine statische Methode auf Dictionary aufrufen (von denen es keine nützlichen gibt), dann wäre es ohne eine Sperre in Ordnung.

Dies ist die allgemeine Regel für alle .NET-Typen im BCL.

2

Du "public static Mitglieder dieser Art" als "public static Instanzen dieser Art" falsch interpretiert.