Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Callback bei MemoryCache-Miss
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

Themenstarter:

Callback bei MemoryCache-Miss

beantworten | zitieren | melden

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ß
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Grumbler85 am .
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)
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5989
Herkunft: Leipzig

beantworten | zitieren | melden

Zitat von Grumbler85
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
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

Themenstarter:

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7563
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Grumbler85,

gleich als Hinweis vorweg und weils falsch in der MSDN stand (weiß nicht obs korrigiert wurde): der MemoryCache ist threadsicher.
Zitat
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.
Zitat
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!"
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

Themenstarter:

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers