当前位置: 代码迷 >> C# >> C# MemoryCache内存储器项目无法缓存
  详细解决方案

C# MemoryCache内存储器项目无法缓存

热度:62   发布时间:2016-05-05 04:47:49.0
C# MemoryCache内存项目无法缓存
.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);
}