.NET4.0新增的System.Runtime.Caching,
希望使用其中的MemoryCache,缓存内存中的变量,并在该变量变化时,进行相应更新。
使用下面的代码进行测试,发现cache中一直没有想要的"cachedText",请教各位大侠,应如何解决此问题,多谢!
private void button2_Click(object sender, RoutedEventArgs e)
{
ObjectCache cache = MemoryCache.Default;
bool flag = cache.Contains("cachedText");
string content = cache["cachedText"] as string;
if (content == null)
{
CacheItemPolicy policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTimeOffset.Now.AddHours(1);
content = textBox2.Text;
CacheItem item =new CacheItem("cachedText", content);
List<string> keys = new List<string> { "cachedText" };
policy.ChangeMonitors.Add(cache.CreateCacheEntryChangeMonitor(keys));
cache.Set(item, policy);
}
textBox1.Text = content;
}
------解决思路----------------------
设置缓存依赖项有其规范。没有现成的办法去监视“内存变化时”这种依赖项。顶多可以让成百上千的缓存单元依赖为另一个缓存单元,这样当这个缓存单元修改时,相关联的所有缓存单元就自动丢弃了。但是这就要求叫做“cachedText” 的缓存单元依赖于另外一个(比如说)叫做“最后结账时间”的缓存单元,而不是依赖“内存变量”。
除非你自己开发一个 CacheDepency(从这个类型继承,开发你自己的子类)才能依赖变量,但是这还是要考虑到效率问题。
------解决思路----------------------
可能你误解了CacheEntryChangeMonitor。它不是用来监视‘变量变化’的,而是用来监视缓存条目的变化。
因为你登记的监视器监视一个尚不存在的条目,它一开始就认定有变化,变化就导致了缓存失效。
下面例子解释CacheEntryChangeMonitor的用法:
private void button2_Click(object sender, RoutedEventArgs e)
{
ObjectCache cache = MemoryCache.Default;
if (!cache.Contains("Master"))
{
cache.Add("Master", "Hello", DateTimeOffset.MaxValue);
}
bool flag = cache.Contains("cachedText");
string content = cache["cachedText"] as string;
if (content == null)
{
CacheItemPolicy policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTimeOffset.Now.AddHours(1);
content = textBox2.Text;
CacheItem item = new CacheItem("cachedText", content);
List<string> keys = new List<string> { "Master" };
policy.ChangeMonitors.Add(cache.CreateCacheEntryChangeMonitor(keys));
cache.Set(item, policy);
}
textBox1.Text = content;
}
private void button3_Click(object sender, RoutedEventArgs e)
{
MemoryCache.Default.Set("Master", "改变Master将导致任何‘依赖’于Master的条目失效", DateTimeOffset.MaxValue);
}