2011-09-15 12 views
7

Por un simple ejemplo, me gustaría tener una lista de cadenas. Cada elemento de la lista debe "caducar" 5 minutos después de agregarlo a la lista. Aunque puede que no haya una manera fácil e integrada de hacerlo, me gustaría terminar con una estructura de datos cuya API parezca que "simplemente funciona".Lista de C# donde los artículos tienen un TTL

Es posible que la utiliza de la siguiente manera:

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)); 

elementos de Inspección de inmediato cederían

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

Unos minutos más tarde, debe aportar

["Tom", "Tim"] 

Finalmente, la lista debe estar vacía .

+1

¿Cuál es tu pregunta? –

+0

Solo estoy buscando ideas para una implementación. – Larsenal

Respuesta

23

Puede usar la clase MemoryCache en .NET 4, que le permite especificar un TTL cuando agrega un elemento.

ejemplo simple:

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 

Aunque no le proporciona directamente con una lista TTL se podría adaptar esta para su solución, sin necesidad de implementar caducidad de la caché mismo.

+0

Oh, no sabía nada de eso ... mucho mejor +1 –

+0

+1 Es por eso que leo stackoverflow todos los días. Para aprender cosas –

+0

@BrokenGlass ¿Alguna vez los artículos serán desalojados de 'MemoryCache' ** antes ** de que expire su TTL? Por ejemplo, ¿qué sucede cuando se llega a 'MemoryCache.CacheMemoryLimit'? –

0

Debe poder usar SortedDictionary<DateTime, ...> y un IComparer<DateTime> personalizado que "invierta" el orden del diccionario para que los elementos más antiguos sean los primeros. Antes de devolver elementos del diccionario, simplemente elimine los primeros N elementos que sean demasiado antiguos.

Por supuesto, la modificación de la colección "bajo las sábanas", cuando la persona que llama está a la espera de una lectura simple puede dar lugar a problemas en el entorno multi-hilo, pero este es un tema diferente ...

Cuestiones relacionadas