C#: Comment mettre en place une smart cache

J'ai quelques endroits où la mise en œuvre de certains sorte de cache peut être utile. Par exemple dans les cas de faire des recherches de ressources fondées sur la coutume de cordes, de trouver des noms de propriétés à l'aide de la réflexion, ou d'avoir un seul PropertyChangedEventArgs par nom de la propriété.

Un exemple simple de cette dernière:

public static class Cache
{
    private static Dictionary<string, PropertyChangedEventArgs> cache;
    static Cache()
    {
        cache = new Dictionary<string, PropertyChangedEventArgs>();
    }
    public static PropertyChangedEventArgs GetPropertyChangedEventArgs(
        string propertyName)
    {
        if (cache.ContainsKey(propertyName))
            return cache[propertyName];

        return cache[propertyName] = new PropertyChangedEventArgs(propertyName);
    }
}

Mais, ce travail sera bien? Par exemple, si nous avons eu un tas de différents propertyNames, qui nous obligerait à la fin avec un énorme cache assis là, de ne jamais être nettoyés ou quoi que ce soit. J'imagine, si ce qui est mis en cache sont les plus grandes valeurs, et si la demande est depuis longtemps l'un, cela pourrait finir comme une sorte de problème... qu'en pensez-vous? Comment faut-il une bonne mémoire cache de mise en œuvre? Est-ce un assez bon pour la plupart des besoins? Des exemples de quelques belles implémentations de cache qui ne sont pas trop difficiles à comprendre ou trop complexe à mettre en œuvre?

  • "Il y a seulement deux choses dures dans l'Informatique: l'invalidation du cache et de nommer les choses." - Phil Karlton
  • Ce n'est pas la peine de l'ensemble de la réponse, mais cette mise en œuvre serait un échec spectaculaire dans un environnement multi-thread. À un strict minimum, vous avez besoin d'un verrou autour de l'accès à cache dans GetPropertyChangedEventArgs(). Juste essayer d'aider quelqu'un qui arrive et la copie des pâtes à la ce.
InformationsquelleAutor Svish | 2009-07-15