SortedDictionary und Caching

15/02/2010 - 15:44 von Gunter Becker | Report spam
Hallo zusammen,

ich habe Probleme mit dem Caching. Ich habe mehrer SortedDictionary,
die ich in Cache-Objekten speichere. Sie verweisen mit einer
CacheDependency auf ein anderes Cache-Objekt, für das ich eine
CustomCacheDependency geschrieben habe. In dieser CacheDependency wird
alle halbe Minute überprüft, ob das Objekt noch aktuell ist! Wenn
nicht, dann werden logischerweise alle gecachten Dictionaries aus dem
Cache gelöscht. Also, so wie es sein soll. Und das funktioniert auch
einwandfrei!

Leider kommt es jetzt öfter mal vor, dass ich eine Null-Refrenz
bekomme, wenn ich auf eines der Dictionaries zugreifen möchte.
Allerdings frage ich immer ab, ob das Objekt noch im Cache ist. Wenn
nicht erstelle ich es neu (denke ich zumindest)! Hier mal ein paar
Codezeilen!

Eigenschaft, in der das Cache-Objekt angelegt bzw. abgefragt wird:

public SortedDictionary<string, MapLayerType> MaxSortedLayers
{
get {
if (_context.Cache["MaxSortedLayers"] == null)
{
string[] cacheKeys = new string[1]
{"MaxMapDefinition"};
CacheDependency sortedLayerDependency = new
CacheDependency(null,cacheKeys);
_context.Cache.Insert("MaxSortedLayers",
SortedLayers(_csoManager.MaxMapDefinition), sortedLayerDependency);
}

return (SortedDictionary<string,
MapLayerType>)_context.Cache["MaxSortedLayers"];
}
}

Und hier verwende ich es dann in einer anderen Klasse:

SortedDictionary<string, MapLayerType> maxSortedLayers mapFactory.MaxSortedLayers;

if (maxSortedLayers.ContainsKey(layerRow.LayerName)) ... /// FEHLER
maxSortedLayers = null

Liegt es vielleicht daran, dass ich eine lokale Kopie mache (oder ist
das keine Kopie sondern nur eine Referenz) und ich gerade dann
zugreifen möchte, wenn dass Objekt nicht mehr verfügbar, sprich aus
dem Cache gelöscht wurde!??

Da es nicht immer passiert bin Ich bin ein wenig ratlos und bràuchte
da mal ein paar kluge Tips!

Danke, Gunter
 

Lesen sie die antworten

#1 Thomas Bandt
15/02/2010 - 17:16 | Warnen spam
Gunter Becker wrote:
Da es nicht immer passiert bin Ich bin ein wenig ratlos und bràuchte
da mal ein paar kluge Tips!



Damit kannst du die NullReferenceExceptions umgehen:

var sortedLayers = (SortedDictionary<string,
MapLayerType>)_context.Cache["MaxSortedLayers"];
if (sortedLayers == null)
{
string[] cacheKeys = new string[1] {"MaxMapDefinition"};
CacheDependency sortedLayerDependency = new
CacheDependency(null,cacheKeys);
sortedLayers = SortedLayers(_csoManager.MaxMapDefinition)
_context.Cache.Insert("MaxSortedLayers", sortedLayers,
sortedLayerDependency);
}
return sortedLayers;

Grundsàtzlich erstellst du nur eine Referenz und keine
Kopie, weshalb die Fehler dann auch auftreten konnten,
wenn zw. Check und letztendlichem Zugriff das Objekt
aus dem Cache gelöscht wurde.

Gruß, Thomas [MVP ASP/ASP.NET]
http://www.69grad.de

Ähnliche fragen