2009-04-09 5 views
2

J'écris une application console en C# dans laquelle je veux mettre en cache certains éléments pendant une durée prédéfinie (disons 1 heure). Je souhaite que les éléments ajoutés dans ce cache soient automatiquement supprimés après leur expiration. Y a-t-il une structure de données intégrée que je peux utiliser? N'oubliez pas que cette application n'est pas une application Web.C# Collection dont les éléments expirent

Répondre

3

Je ne connais pas d'objets dans le BCL qui font cela, mais j'ai déjà écrit des choses similaires. Vous pouvez le faire assez facilement en incluant simplement un System.Threading.Timer à l'intérieur de votre classe de mise en cache (pas de dépendances web/winforms), et en enregistrant une date d'expiration (ou de dernière utilisation) sur vos objets. Il suffit de vérifier la minuterie toutes les quelques minutes et de supprimer les objets que vous voulez expirer.

Cependant, soyez vigilant sur les événements sur vos objets. J'avais un système comme celui-ci, et je ne faisais pas très attention à me désinscrire des événements sur mes objets dans le cache, ce qui empêchait une fuite subtile, mais désagréable, au fil du temps. Cela peut être très difficile à déboguer.

6

Avez-vous réellement besoin de les retirer du cache à ce moment-là? Ou juste que les futures demandes au cache pour cet élément devraient retourner null après un temps donné?

Pour ce faire, vous auriez besoin d'une sorte de thread d'arrière-plan qui purgeait périodiquement le cache. Cela ne serait nécessaire que si vous étiez préoccupé par la consommation de mémoire ou quelque chose. Si vous voulez juste que les données expirent, ce serait facile à faire.

Il est trivial de créer une telle classe.

class CachedObject<TValue> 
{ 
DateTime Date{get;set;} 
TimeSpan Duration{get;set;} 
TValue Cached{get;set;} 
} 

class Cache : Dictionary<TKey,TValue> 
{ 
    public new TValue this(TKey key) 
    { 
    get{ 
    if (ContainsKey(key)) 
    { 
     var val = base.this[key]; 
     //compare dates 
     //if expired, remove from cache, return null 
     //else return the cached item. 
    } 
    } 

    set{//create new CachedObject, set date and timespan, set value, add to dictionary} 

    } 
3

Inclure une propriété ExpirationDate dans l'objet que vous serez en mémoire cache (probablement une enveloppe autour de votre objet réel) et définissez expirer en une heure dans son constructeur. Au lieu de supprimer des éléments de la collection, accédez à la collection via une méthode qui filtre les éléments expirés. Ou créez une collection personnalisée qui le fait automatiquement. Si vous devez supprimer des éléments du cache, votre collection personnalisée peut à la place purger les éléments expirés à chaque appel de l'un de ses membres.

6

Son déjà dans le BCL. Ce n'est tout simplement pas là où vous vous attendez à le trouver: vous pouvez également utiliser System.Web.Caching à partir d'autres types d'applications, pas seulement dans ASP.NET.

This search on google links to several resources about this.

+3

utilisation MemoryCache à la place http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache(v=vs.100).aspx voir: http: // stackoverflow .com/a/793720/303290 tl; dr: "Si les objets Cache sont utilisés en dehors d'ASP.NET, la mémoire système réservée pour les objets Cache n'est pas libérée" – mbx

Questions connexes