2015-11-12 3 views
0

J'utilise le bloc de mise en cache de la bibliothèque d'entreprise sans fichier de configuration. Les paramètres de cache sont initialisés à partir de mon code. J'initialiser le cache avec le code suivant:Configuration de la mise en cache de la bibliothèque d'entreprise sans fichier de configuration

static class LocalCache 
    { 
     private static readonly CacheManager CacheManager; 

     static LocalCache() 
     { 
      try 
      { 
       string localCacheName = "MyCache"; 

       DictionaryConfigurationSource configSource = new DictionaryConfigurationSource(); 
       CacheManagerSettings cacheSettings = new CacheManagerSettings(); 

       configSource.Add(CacheManagerSettings.SectionName, cacheSettings); 
       CacheStorageData storageConfig = new CacheStorageData("NoStorage", typeof(NullBackingStore)); 
       cacheSettings.BackingStores.Add(storageConfig); 

       var expirationPollFrequencyInSeconds = 2; 
       CacheManagerData cacheManagerData = new CacheManagerData(
        localCacheName, 
        expirationPollFrequencyInSeconds, 
        100, 
        20, 
        storageConfig.Name 
        ); 
       cacheSettings.CacheManagers.Add(cacheManagerData); 
       cacheSettings.DefaultCacheManager = cacheManagerData.Name; 

       CacheManagerFactory cacheFactory = new CacheManagerFactory(configSource); 
       CacheManager = cacheFactory.CreateDefault(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
      } 
     } 

     public static T GetData<T>(string cacheKey) 
     { 
      var value = CacheManager.GetData(cacheKey); 
      return (T)value; 
     } 

     public static void AddData(string cacheKey, object value) 
     { 
      CacheManager.Add(cacheKey, value);     
     } 
    } 

Le problème est que les expirationPollFrequencyInSeconds (ici 2 secondes) ne sont pas pris en compte lors de la récupération d'un élément de cache qui est censé expirer. L'élément réside dans le cache plus de 2 secondes. Une idée?

Voir un exemple de test ci-dessous:

private static void Main(string[] args) 
    { 
     try 
     { 
      LocalCache.AddData("One", 1); 
      Thread.Sleep(5000); 
      LocalCache.AddData("Two", 2); 

      object data = LocalCache.GetData<object>("One"); 

      if (data == null) Console.WriteLine("Data not in cache"); 
      else Console.WriteLine("-----> Data in cache whereas it should not !!!"); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 
    } 

Sortie:

-----> Data in cache whereas it should not !!! 

Répondre

0

Sur la base de la documentation en ligne pour la classe CacheManagerData, le constructeur ne prend pas en cache des experts en période de durée. Au lieu de cela, le deuxième argument est la période après laquelle le gestionnaire vérifiera si les éléments mis en cache doivent être supprimés s'il y a trop d'éléments.

Donc, 2 secondes ne sont pas l'expiration du cache.

La présence d'un trop grand nombre dépend du troisième argument.

https://msdn.microsoft.com/en-us/library/ee779632.aspx

Si vous souhaitez ajouter une période d'expiration, puis un coup d'oeil à l'adresse suivante:

http://www.codeproject.com/Articles/51409/Exploring-Caching-Using-Caching-Application-Enterp#heading0016