2011-09-15 10 views
7

Per un semplice esempio, mi piacerebbe avere un elenco di stringhe. Ogni elemento nell'elenco dovrebbe "scadere" 5 minuti dopo averlo aggiunto all'elenco. Anche se potrebbe non esserci un modo semplice e integrato per farlo, mi piacerebbe finire con una struttura dati la cui API sembra funzionare ".C# lista dove gli articoli hanno un TTL

si potrebbe utilizzare come segue:

var now = DateTime.now(); 
var list = new ListWithTTL<string>(); 
list.add("Bob", now); 
list.add("Joe", now.AddMinutes(1)); 
list.add("Tom", now.AddMinutes(2)); 
list.add("Tim", now.AddMinutes(2)); 

elementi Ispezione immediatamente produrrebbe

["Bob", "Joe", "Tom", "Tim"] 

Pochi minuti dopo si dovrebbe produrre

["Tom", "Tim"] 

Alla fine l'elenco dovrebbe essere vuoto .

+1

Qual è la domanda? –

+0

Solo alla ricerca di idee per un'implementazione. – Larsenal

risposta

23

È possibile utilizzare la classe MemoryCache in .NET 4 che consente di specificare un TTL quando si aggiunge un elemento.

semplice esempio:

MemoryCache cache = new MemoryCache("foo"); 
cache.Add("bar", "baz", DateTime.Now.AddSeconds(5)); 
var bar = cache["bar"];//returns "baz" 
Thread.Sleep(TimeSpan.FromSeconds(6)); 
var expired = cache["bar"]; //returns null 

Pur non fornendo direttamente con una lista TTL si potrebbe adattare questo per la soluzione, senza necessità di implementare la scadenza della cache da soli.

+0

Oh, non lo sapevo ... molto meglio +1 –

+0

+1 Questo è il motivo per cui ho letto StackOverflow ogni giorno. Per imparare cose. –

+0

@BrokenGlass Gli oggetti saranno mai sfrattati da 'MemoryCache' ** prima ** il loro TTL scade? Ad esempio, cosa succede quando viene raggiunto 'MemoryCache.CacheMemoryLimit'? –

0

Dovresti essere in grado di utilizzare SortedDictionary<DateTime, ...> e un numero personalizzato IComparer<DateTime> che "inverte" l'ordine del dizionario in modo che gli elementi più vecchi vengano prima. Prima di restituire elementi dal dizionario, è sufficiente rimuovere i primi N elementi troppo vecchi.

Naturalmente, modificando collezione "sotto le coperte" quando il chiamante è in attesa di una semplice lettura può portare a problemi in ambiente multi-thread, ma questo è un argomento diverso ...

Problemi correlati