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.
So wird ConcurrentDictionary.GetEnumerator
implementiert:
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
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.
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.
Tags und Links c# multithreading session dictionary collections