.Net MemoryCache不工作!缓存变为无效并按呼叫重新填充

时间:2014-03-12 19:34:36

标签: c# asp.net performance caching memorycache

我不确定这种行为是否是由于应用程序的性质(控制台应用程序)造成的。我的最终目标是在类库中使用System.Runtime.Caching.MemoryCache类,该类将在ASP.Net MVC应用程序中使用。目标是从每次XML文件(数据源)在网络文件夹上更改时填充的MemoryCache返回数据。

为了完成我的实现,我编写了一个简单的控制台应用程序,其中包含将被缓存的List<>个对象。这是代码。

using System;
using System.Collections.Generic;
using System.Runtime.Caching;
using CachePersons.Core.Logging;

namespace CachePersons
{
    class Program
    {
        static void Main(string[] args)
        {
            GetPersons();
            GetPersons();
            GetPersons();

            Console.ReadKey();
        }

        static List<string> GetPersons()
        {
            List<string> persons;

            Log.Debug("Entered GetPersons()");
            Console.WriteLine("Entered GetPersons()");

            //get default cache
            ObjectCache cache = MemoryCache.Default;

            //get persons
            persons = (List<string>)cache.Get("Persons");

            //if cache does not contain the persons, create new list and add it to cache
            if (persons == null)
            {
                persons = GetPersonsFromDatabase();

                cache.Add("Persons", persons, new CacheItemPolicy());
            }
            else
            {
                Log.Debug("    Found Data in Cache!");
                Console.WriteLine("    Found Data in Cache!");
            }

            Log.Debug("Exited GetPersons()");
            return persons;
        }

        static List<string> GetPersonsFromDatabase()
        {
            Log.Debug("    Populating Cache 1st time.");
            Console.WriteLine("    Populating Cache 1st time.");
            return new List<string>()
            {
                "John Doe",
                "Jane Doe"
            };
        }

    }
}

然后我构建了项目并打开了2个单独的命令窗口,然后逐个运行。我期望(ed)在DebugView,Console Output上看到的是,只有一次将填充Cache,并且第二次.exe调用将在缓存中找到数据,并从那里返回它。但那不是发生了什么。请参阅以下屏幕截图来自console和debugview。

enter image description here

并在DebugView中......

enter image description here

我做错了什么?这种行为是因为我使用的是控制台应用吗?如何让缓存在类库中的方法调用中工作?如果在Web应用程序中使用相同的库(IIS 7.5上的ASP.Net MVC),我还需要注意哪些注意事项。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可能会发现 Memory-Mapped Files 很有帮助。

PS :如果您打算在IIS上运行您的应用。您的原始代码应该没问题。