Wird ConcurrentDictionary beim Iterieren über ConcurrentDictionary und nur beim Lesen gesperrt?

10
  1. Ich habe ein ConcurrrentDictionary als Anwendungsobjekt in meiner Web-App erstellt. und es wird unter Sitzungen geteilt. (Im Grunde dient als ein Repository.)
  2. Manchmal wird dem Wörterbuch nach jeder verfügbaren Sitzung ein neues Element hinzugefügt.

Nur Administratoransicht zulassen

Ich möchte nun zulassen, dass ein Administrator alle Werte im Wörterbuch auflistet, aber der Administrator wird keine Elemente hinzufügen oder entfernen , stattdessen gebe ich nur eine Möglichkeit für den Administrator, das zu sehen Elemente über ein Lesen der Sammlung durch Iterieren durch die Elemente.

(Pseudo) Code würde ungefähr so ​​aussehen :

%Vor%

Meine Frage ist dies:

Wenn ich die Elemente iteriere, wird das ConcurrentDictionary gesperrt, während es gelesen wird? Mit anderen Worten, ist das ConcurrentDictionary gesperrt, so dass andere Sitzungen nicht hinzugefügt oder entfernt werden können, während der Admin-Code einfach durch das ConcurrentDictionary iteriert?

Wenn nicht gesperrt, können Sie dies erklären

Wenn Sie glauben, dass es nicht gesperrt ist, können Sie eine kurze Zusammenfassung darüber geben, wie es das macht? Zum Beispiel erstellt es eine Kopie des ConcurrentDictionary für die schreibgeschützte Aktion und ermöglicht dann das Ausführen der Leseiterationen - unter Berücksichtigung, dass gleichzeitige Änderungen am realen Wörterbuch nicht zu sehen sind?

Was ich herausfinden möchte

Ich versuche die Auswirkungen der Bereitstellung eines ConcurrentDictionary-Viewers zu verstehen, der oft von einem Admin aktualisiert werden könnte. I.E. Wenn sie oft genug aktualisiert wurden, konnte sich das auf die Leistung der Web-App auswirken. Wenn Sitzungen warten, bis das Objekt entsperrt wird, können sie Elemente hinzufügen / entfernen.

    
raddevus 16.06.2014, 15:20
quelle

2 Antworten

8

So wird ConcurrentDictionary.GetEnumerator implementiert:

%Vor%

Wie Sie sehen, ist die Iteration frei von Sperren und liefert einfach eine unveränderliche Struktur ( KeyValuePair ), die für jede Iteration an den Aufrufer zurückgegeben wird. Aus diesem Grund kann eine Momentaufnahme der ConcurrentDictionary

nicht garantiert werden

Dies wird definitiv keinen Leistungseinfluss auf das Hinzufügen / Aktualisieren neuer Werte während der Iteration haben, aber es kann nicht garantieren, dass Ihr Administrator den aktuellsten Snapshot des Wörterbuchs sehen wird.

  1. Sie können den Rest des Quellcodes selbst durchsuchen Ссылка
  2. Und Sie können auch In den gleichzeitigen Sammlungen nachsehen: ConcurrentDictionary von Simon Cooper.
  3. Sind alle neuen gleichzeitigen Sammlungen sperrfrei?
Yuval Itzchakov 16.06.2014, 15:38
quelle
4

Dies ist, was die Dokumentation sagt:

  

Der aus dem Wörterbuch zurückgegebene Enumerator ist sicher zu verwenden   gleichzeitig mit Lese-und Schreibvorgänge in das Wörterbuch, aber es tut   nicht einen Moment-in-Moment-Snapshot des Wörterbuchs darstellen. Das   Inhalte, die über den Enumerator verfügbar gemacht werden, können Änderungen enthalten   in das Wörterbuch nach GetEnumerator wurde aufgerufen.

Ссылка

Wenn Sie also ein "Schnappschuss" -Verhalten wünschen, müssen Sie eine Kopie der Keys-Sammlung erstellen und über die Kopie iterieren, andernfalls werden Sie über die mutable threadsichere Sammlung iterieren.

    
Volma 16.06.2014 15:27
quelle