Ich habe meine eigene Change-Monitor-Klasse für den .Net MemoryCache geschrieben. Es scheint zu initialisieren, aber wenn ich versuche, es dem Cache hinzuzufügen, löst es eine InvalidOperation-Ausnahme aus "Die Methode wurde bereits aufgerufen und kann nur einmal aufgerufen werden."
Meine Änderungsmonitorklasse
%Vor%Der Code, den ich verwende, um die Cache-Richtlinie zu erstellen und das Schlüssel / Wert-Paar dem Cache hinzuzufügen
%Vor%Der Aufruf von Set löst die Ausnahme für ungültige Operation aus, die seltsam ist, da laut der MSDN-Dokumentation nur ArgumentNull, Argument, ArgumentOutOfRange und NotSupported Exceptions ausgelöst werden.
Ich bin mir sicher, dass ich einen einfachen Fehler machen muss. Aber es ist schwer, gute Dokumentation oder Beispiele zum Schreiben eines eigenen Änderungs-Monitors zu finden. Jede Hilfe würde geschätzt werden
Ich weiß, dass die Kommentare die Antwort haben, aber ich wollte, dass es offensichtlicher ist ...
Wenn ein ChangeMonitor
verwendet wird, wird es sofort ausgelöst, wenn der Cache-Eintrag nicht existiert.
MSDN Dokumentation sagt es so :
Es wird davon ausgegangen, dass sich ein überwachter -Eintrag für eines der geändert hat folgende Gründe:
A) Der Schlüssel existiert zum Zeitpunkt des Anrufs nicht CreateCacheEntryChangeMonitor-Methode. In diesem Fall ist das Ergebnis Die CacheEntryChangeMonitor-Instanz wird sofort auf eine geänderte Instanz gesetzt Zustand. Dies bedeutet, dass, wenn der Code anschließend bindet a Rückruf ändern, Der Rückruf wird sofort ausgelöst .
B) Der zugehörige Cache-Eintrag wurde aus dem Cache entfernt. Das kann auftreten, wenn der Eintrag explizit entfernt wird, wenn er abläuft oder wenn dies der Fall ist gelöscht, um Speicher wiederherzustellen
Ich habe eine späte Antwort geschrieben, da ich gerade das gleiche Problem gesehen habe und meine eigenen Untersuchungen durchgeführt habe.
Wenn Sie Ihren Change Monitor mit einer Richtlinie für zwischengespeicherte Elemente registrieren - policy.ChangeMonitors.Add(cm)
- registriert die CacheItemPolicy
-Implementierung über ChangeMonitor.NotifyOnChanged
einen eigenen Änderungsrückruf. Sie sollten nicht cm.NotifyOnChanged
aufrufen, um einen weiteren Callback zu registrieren, oder es wird The method has already been invoked, and can only be invoked once
an diesem Punkt ausgeben.
Verwenden Sie stattdessen CacheItemPolicy.UpdateCallback
oder CacheItemPolicy.RemovedCallback
, um das Cache-Element zu aktualisieren / zu entfernen, z. wie in diesem Blogpost beschrieben.
Ich hatte genau den gleichen Fehler:
%Vor%Ich habe stundenlang danach gesucht ... bis das Licht der Logik mich traf:
Ich verwendete ein statisches Richtlinienobjekt, das wiederverwendet wurde. (Ein unbewusster Prozess in mir verwendet alle Objekte, wenn sie gleich sind, vielleicht habe ich Angst, Objekte zu konstruieren, die einige Bytes im Speicher verbrauchen)
Durch das Erstellen eines neuen Richtlinienobjekts für jedes Objekt im Cache wurde der Fehler behoben. Ziemlich logisch, wenn Sie darüber nachdenken.
Tags und Links .net c# invalidoperationexception