Laden...

Callback bei MemoryCache-Miss

Erstellt von Grumbler85 vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.642 Views
G
Grumbler85 Themenstarter:in
538 Beiträge seit 2008
vor 12 Jahren
Callback bei MemoryCache-Miss

Hallo allerseits,

ich versuche grade ein paar Daten in einem System.Runtime.Caching.MemoryCache abzulegen.
Dabei bin ich über folgende Fragestellung gestolpert:

Wenn ich einen Cache-Miss habe - gibt es die Möglichkeit einen Callback (zu registrieren (beispielsweise einen der auf dem Key operiert), der automatisch aufgerufen wird, oder muss ich das "per Hand" machen?

Und welchen Sinn macht eigentlich die AddOrGetExisting-Funktion?

Gruß

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

5.657 Beiträge seit 2006
vor 12 Jahren

Und welchen Sinn macht eigentlich die AddOrGetExisting-Funktion?

In der Doku steht unter Return Value: "If a cache entry with the same key exists, the existing cache entry; otherwise, Nothing." Sollte eigentlich alles erklären, oder?

Christian

Weeks of programming can save you hours of planning

G
Grumbler85 Themenstarter:in
538 Beiträge seit 2008
vor 12 Jahren

Vielleicht versteh ich was nicht, aber wenn ich ein Element hinzufügen will - dann habe ich es offensichtlich schon - warum sollte ich dann ein vorhandenes aus dem Cache nehmen?

Aber das hängt wohl indirekt mit dem Callback zusammen, den ich noch nicht gefunden habe ...

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Grumbler85,

gleich als Hinweis vorweg und weils falsch in der MSDN stand (weiß nicht obs korrigiert wurde): der MemoryCache ist threadsicher.

Und welchen Sinn macht eigentlich die AddOrGetExisting-Funktion?

Abgesehen davon dass es eine Methode und keine Funktion ist, steht das in

Zitat von: AddOrGetExisting Method (CacheItem
The item parameter supplies the key and the value that is used by the method. If the cache has a cache entry with the same key as the key of the item parameter, the method returns the existing entry as a CacheItem instance. If there is no existing cache entry, the method creates a new one by using the key and value supplied by the item parameter, and with the eviction details specified by policy.

Wenn ich einen Cache-Miss habe - gibt es die Möglichkeit einen Callback (zu registrieren (beispielsweise einen der auf dem Key operiert), der automatisch aufgerufen wird, oder muss ich das "per Hand" machen?

Hierzu hab ich mir einen Wrapper für den MemoryCache geschrieben, der das erledigt.
Grob so:


private readonly Func<string, T> _factory;
private readonly MemoryCache _memoryCache;

// mehrere Überladung gibts davon
public Cache(Func<string, T> factory, TimeSpan timeout, string name)
{
	Contract.Requires<ArgumentNullException>	  (factory != null);
	Contract.Requires<ArgumentOutOfRangeException>(timeout.Ticks >= 0);
	Contract.Requires<ArgumentNullException>	  (!string.IsNullOrWhiteSpace(name));
	//-----------------------------------------------------------------
	_memoryCache = Cache.GetMemoryCache(name);   // Factory
	_factory     = factory;
	this.TimeOut = timeout;
	this.Name    = name;
}
//---------------------------------------------------------------------
public virtual T this[string key]
{
	get
	{
		Contract.Requires<ArgumentNullException>(!string.IsNullOrWhiteSpace(key));
		//-------------------------------------------------------------
		T value = default(T);

		if (_memoryCache.Contains(key))
			value = (T)_memoryCache[key];
		else
		{
			value = _factory(key);

			_memoryCache.Set(
				key,
				value,
				this.CreatePolicy());
		}

		return value;
	}
}
//---------------------------------------------------------------------
private CacheItemPolicy CreatePolicy()
{
	CacheItemPolicy policy    = new CacheItemPolicy();
	policy.AbsoluteExpiration = new DateTimeOffset(
		DateTime.Now.Add(this.TimeOut));

	return policy;
}

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

G
Grumbler85 Themenstarter:in
538 Beiträge seit 2008
vor 12 Jahren

Ah - das ist auch ne gute Idee - ich habe eben versucht das ganze über ein CacheMiss Event zu regeln. Damit laufe ich aber gefahr, dass mehrere Instanzen die den Cache nutzen das Objekt versuchen zu setzen.

Vielen Dank

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)