2011-03-21 46 views
1

我正在使用Microsoft EnterPrise库缓存库(版本5)和FileDependency。FileDependency文件更改后缓存失败

在我想缓存的类上,我有一个静态属性,它将从缓存中返回项目,或者创建一个新类并将其添加到缓存中。

这最初运行良好,类创建一次,并从此之后,返回缓存的副本。但是,一旦依赖文件更改缓存的项目永远不会返回。

我已经汇总了一个示例程序来说明这个问题。

从这个输出是

999 cached , 1 uncached 
999 cached , 1001 uncached 

我希望的结果是

999 cached , 1 uncached 
1998 cached , 2 uncached 

它看起来就像是重新添加到高速缓存中的对象,但随后立即被删除已过期。

任何想法为什么?

using System; 
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration; 
using Microsoft.Practices.EnterpriseLibrary.Caching; 
using Microsoft.Practices.EnterpriseLibrary.Caching.Expirations; 

namespace TestCache 
{ 
    static class Program 
    { 
    [STAThread] 
    static void Main() 
    { 
     Cache.Create(); 

     for (int i = 0; i < 1000; i++) 
      TestClass.Current.DummyMethod(); 
     Console.WriteLine(String.Format("{0} cached , {1} uncached", TestClass.CachedItems, TestClass.UncachedItems)); 

     System.IO.File.AppendAllText(Cache.dependencyFileName, "Test"); 

     for (int i = 0; i < 1000; i++) 
      TestClass.Current.DummyMethod();   
     Console.WriteLine(String.Format("{0} cached , {1} uncached", TestClass.CachedItems, TestClass.UncachedItems)); 

     Console.ReadLine(); 
    } 
} 

public class Cache 
{ 
    public static CacheManager cacheManager = null; 
    public static string dependencyFileName; 
    public static FileDependency objFileDependency; 

    public static void Create() 
    { 
     var builder = new ConfigurationSourceBuilder(); 

     builder.ConfigureCaching() 
       .ForCacheManagerNamed("TestCache") 
       .UseAsDefaultCache() 
       .StoreInMemory(); 

     var configSource = new DictionaryConfigurationSource(); 
     builder.UpdateConfigurationWithReplace(configSource); 
     EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(configSource); 

     cacheManager = (CacheManager)EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>("TestCache"); 

     dependencyFileName = "testCache.xml"; 
     if (!System.IO.File.Exists(dependencyFileName)) 
      using (System.IO.File.Create(dependencyFileName)) { } 

     objFileDependency = new FileDependency(dependencyFileName); 
    } 
} 

public class TestClass 
{ 

    public static int CachedItems =0; 
    public static int UncachedItems = 0; 

    public void DummyMethod() 
    { 
    } 

    public static TestClass Current 
    { 
     get 
     { 
      TestClass current = (Cache.cacheManager.GetData("Test") as TestClass); 
      if (current != null) 
       CachedItems++; 
      else 
      { 
       UncachedItems++; 
       current = new TestClass(); 
       Cache.cacheManager.Add("Test", current, CacheItemPriority.Normal, null, new ICacheItemExpiration[] { Cache.objFileDependency }); 
      } 
      return current; 
     } 
    } 

} 

}

回答

1

你的问题是,你正在使用一个静态FileDependency。这会导致FileDependency的LastUpdateTime永远不会更新,从而导致添加到缓存的所有项目都显示为已过期(HasExpired() == true)。即使您正在将项目添加到缓存,因为它们已过期,因此您无法检索它们。

解决方案是使用新的FileDependency对象来添加所有缓存。最简单的变化是用属性替换objFileDependency字段。使用您现有的名称和方法,代码将如下所示:

public class Cache 
{ 
    public static CacheManager cacheManager = null; 
    public static readonly string dependencyFileName = "testCache.xml";    

    public static FileDependency objFileDependency 
    { 
     get 
     { 
      return new FileDependency(dependencyFileName); 
     } 
    } 

    public static void Create() 
    { 
     var builder = new ConfigurationSourceBuilder(); 

     builder.ConfigureCaching() 
       .ForCacheManagerNamed("TestCache") 
       .UseAsDefaultCache() 
       .StoreInMemory(); 

     var configSource = new DictionaryConfigurationSource(); 
     builder.UpdateConfigurationWithReplace(configSource); 
     EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(configSource); 

     cacheManager = (CacheManager)EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>("TestCache"); 

     if (!System.IO.File.Exists(dependencyFileName)) 
      using (System.IO.File.Create(dependencyFileName)) { } 
    } 
} 
+0

非常感谢。 – sgmoore 2011-03-21 17:57:53