Ich muss das gleichzeitige Wörterbuch implementieren, da .Net keine gleichzeitige Implementierung für Sammlungen enthält (da .NET4 enthalten ist). Kann ich dafür "Power Threading Library" von Jeffrey Richter verwenden oder vorhandene Varianten implementieren oder einen Ratschlag implementieren? Danke ...
Ich habe einen Thread-sicheren Wrapper für die normale Dictionary-Klasse geschrieben, der Interlocked verwendet, um das interne Wörterbuch zu schützen. Interlocked ist bei weitem der schnellste verfügbare Sperrmechanismus und bietet eine viel bessere Leistung als ReaderWriterLockSlim, Monitor oder eine der anderen verfügbaren Sperren.
Der Code wurde zum Implementieren einer Cache -Klasse verwendet für Fasterflect , eine Bibliothek zur Beschleunigung der Reflektion. Daher haben wir verschiedene Ansätze ausprobiert, um die schnellstmögliche Lösung zu finden. Interessanterweise sind die neuen gleichzeitigen Auflistungen in .NET 4 merklich schneller als meine Implementierung, obwohl beide verglichen mit Lösungen, die einen leistungsschwächeren Mechanismus verwenden, ziemlich schnell sind. Die Implementierung für .NET 3.5 befindet sich in einer bedingten Region in der unteren Hälfte der Datei.
Ich habe selbst ein Concurrent Dictionary geschrieben (vor .NET 4.0% System.Collections.Concurrent
namespace); da ist nicht viel dran. Sie möchten im Grunde nur sicherstellen, dass bestimmte Methoden nicht gleichzeitig aufgerufen werden, z. B. Contains
und Remove
oder etwas ähnliches.
Was ich getan habe, war die Verwendung von ReaderWriterLock
(in .NET 3.5 und höher, könnten Sie mit ReaderWriterLockSlim
gehen) und AcquireReaderLock
für alle "Lese" -Operationen aufrufen (wie this[TKey]
, ContainsKey
, usw.) und AcquireWriterLock
für alle "Schreib" -Operationen (wie this[TKey] = value
, Add
, Remove
usw.). Stellen Sie sicher, dass alle Aufrufe dieser Art in einen Block try
/ finally
eingeschlossen werden, wodurch die Sperre in finally
aufgehoben wird.
Es ist auch eine gute Idee, das Verhalten von GetEnumerator
geringfügig zu ändern: Anstatt über die vorhandene Auflistung aufzulisten, eine Kopie davon zu erstellen und eine Aufzählung darüber zu erlauben. Andernfalls sehen Sie sich potentiellen Deadlocks gegenüber.
Hier ist eine einfache Implementierung, die vernünftiges Sperren verwendet (obwohl Interlocked
) wäre wahrscheinlich schneller):
Ссылка
Erstellen Sie im Grunde einfach einen Dictionary-Wrapper / Decorator und synchronisieren Sie den Zugriff auf alle Lese- / Schreibaktionen.
Wenn Sie zu .Net 4.0 wechseln, ersetzen Sie einfach alle Ihre Überladungen durch delegierte Aufrufe an das zugrunde liegende ConcurrentDictionary.