Der benutzerdefinierte ChangeMonitor für .Net MemoryCache verursacht eine Ausnahme für einen ungültigen Vorgang

8

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

    
Keith 01.04.2011, 19:37
quelle

3 Antworten

6

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

    
EBarr 24.08.2012 16:21
quelle
2

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.

>     
Noseratio 25.07.2017 20:49
quelle
1

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.

    
JDC 18.01.2017 09:15
quelle