In traditionellen .net-Auflistungen gibt der Wert aus einer Schlüsselsuche in einem Wörterbuch (oder einem Pop/Peek aus einer Warteschlange) einen Zeiger auf ein Objekt im Heap zurück. Wenn Sie diesen Zeiger ändern, wird der Wert im Heap geändert. Infolgedessen ist der Zustand im Wörterbuch mutiert.
Zuverlässige Sammlungen sind eine Fassade um eine viel komplexere Interaktion. Obwohl es wahr ist, dass die Sammlung im Speicher * ist, ist der zuverlässige Zustandsverwalter auch dafür verantwortlich, alle Änderungen an den sekundären Replikaten zu replizieren. Der Mechanismus, durch den das auftritt, ruft CommitAsync für die ITransaction auf.
Wenn Sie nur die In-Memory-Repräsentation eines Objekts mutieren, wird die Änderung niemals auf sekundäre Partitionen repliziert und es kommt zu undefiniertem/unerwartetem Verhalten. (Wenn das aktive Primärsystem zu einem Sekundärsystem wechselt) Wenn Sie CommitAsync aufrufen (selbst wenn Sie Get -> Modify -> Set), kann die Transaktion möglicherweise nicht festgeschrieben werden, und die aktuelle Arbeitsspeicherdarstellung unterscheidet sich von der Sekundärseite Partitionen und die Darstellung auf der Festplatte der primären Partition. Dies führt wiederum zu undefiniertem/unerwartetem Verhalten.
* In den meisten Fällen, außer die Größe der Sammlung ist größer als der verfügbare Speicher. In diesem Fall werden die Werte von der Platte ausgelagert und nur die Schlüssel und die zuletzt verwendeten Werte werden im Speicher gehalten. In der Zukunft habe ich gehört, dass ich weiter blob speichere, wenn der Druck steigt.