Ripopola automaticamente la cache al momento della scadenza

Attualmente memorizzo nella cache il risultato di una chiamata al metodo.

Il codice di memorizzazione nella cache segue lo schema standard: utilizza l’elemento nella cache, se esiste, altrimenti calcola il risultato, memorizzandolo nella cache per le chiamate future prima di restituirlo.

Vorrei proteggere il codice client dai messaggi di errore della cache (ad es. Quando l’elemento è scaduto).

Sto pensando di generare un thread per attendere la durata dell’object memorizzato nella cache, per poi eseguire una funzione fornita per ripopolare la cache quando (o poco prima) l’elemento esistente scade.

Qualcuno può condividere qualsiasi esperienza relativa a questo? Sembra un approccio ragionevole?

Sto usando .NET 4.0.

Poiché questo è ASP.NET, il metodo Cache.Insert() consente di specificare un delegato di richiamata.

Sembra un approccio ragionevole?

Sì, il callback (e la dipendenza dal file) vengono forniti esattamente per questo tipo di situazione. Hai ancora ro fare un commercio tra risorse, latenza e fuori-datità.

Una nuova aggiunta a .NET Framework 4.0 è la class MemoryCache

Citazione dai documenti:

La class MemoryCache è simile alla class Cache ASP.NET. La class MemoryCache ha molte proprietà e metodi per accedere alla cache che ti saranno familiari se hai usato la class Cache ASP.NET

È ansible utilizzare il metodo AddOrGetExisting per ottenere o creare un CacheItem se non esiste.

Ecco una cache che non scade mai nulla:

 var cache = new ConcurrentDictionary(); var value = cache.GetOrAdd(someKey, key => MyMethod(key)); 

Questo aiuta?


Ecco una cache che non scade mai e aggiorna il valore dopo una certa durata:

 var cache = new ConcurrentDictionary>(); var value = cache.AddOrUpdate(someKey, key => Tuple.Create(MyMethod(key), DateTime.Now), (key, value) => (value.Item2 + lifetime < DateTime.Now) ? Tuple.Create(MyMethod(key), DateTime.Now) : value) .Item1; 

Questo aiuta?

Non sembra esserci alcun motivo nello scadere di un object solo per ricrearlo immediatamente. Basta distriggersre la scadenza; dtb mostra come.