Frage

Hashtables hat eine SyncRoot Eigenschaft, aber allgemeiner Wörterbücher nicht. Wenn ich Code, der tut dies:

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

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

War es hilfreich?

Lösung

Wenn Sie ausschließlich für Kompatibilität gehen dann ist Bryan richtig. Dies ist der beste Weg, um Ihre aktuelle Semantik auf einen Wörterbuch zu halten.

Als Erweiterung es aber. Der Grund für die SyncRoot Eigenschaft wurde den Ober Wörterbuch nicht direkt hinzugefügt ist, dass es eine gefährliche Art und Weise ist die Synchronisation zu tun. Es ist nur slighly besser als „lock (this)“, die zu Deadlocks sehr gefährlich und anfällig ist. Hier sind ein paar Links, die sprechen, warum dies ist schlecht.

Andere Tipps

Das neue Denken hinter SyncRoot ist, dass es ein Fehler in dem ursprünglichen Entwurf ist. Wenn das einzige, was zu sperren das Wörterbuch ist und es ist privat, können Sie es oder ein anderes Objekt sperren, der als Synchronisationsobjekt dient. Die letztere Technik ist nützlich, wenn der Staat Sie schützen mehr als nur das Wörterbuch ist.

// 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.
}
var dictionary = new Dictionary<int, string>();

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

Wenn die Hash-Tabelle / Wörterbuch nicht öffentlich ist, können Sie einfach das Dictionary-Objekt sperren sich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top