FileDependency와 함께 Microsoft EnterPrise 라이브러리 캐싱 라이브러리 (버전 5)를 사용하고 있습니다.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;
}
}
}
}
정말 고마워요. – sgmoore