2013-06-19 96 views
1

我在Windows 7上运行VS 2010 Ultimate并尝试使用MemoryCache(System.Runtime.Caching),出于某种原因,当方法结束并重新运行时,缓存立即清除该方法再次,它试图创建一个新的。这里是我使用从MSDN文档代码:奇怪的MemoryCache类问题

  ObjectCache cache = MemoryCache.Default; 
    string fileContents = cache["filecontents"] as string; 

    if (fileContents == null) 
    { 
     CacheItemPolicy policy = new CacheItemPolicy(); 

     List<string> filePaths = new List<string>(); 
     filePaths.Add("c:\\Windows\\Enterprise.xml"); 

//  policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths)); 
     policy.Priority = CacheItemPriority.NotRemovable; 
     policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(3600); 

     // Fetch the file contents. 
     fileContents = 
      File.ReadAllText("c:\\Windows\\Enterprise.xml"); 

     cache.Set("filecontents", fileContents, policy); 
    } 

     Console.WriteLine(fileContents); 

我在控制台Main方法中有此代码。

令人惊讶的是我有一个包装C#4.0程序集,我从QTP中使用,它工作得非常好。缓存保留在QTP的每次运行中。

请帮忙。

+1

所以如果这是在Main方法中,程序在这之后关闭还是进入循环? –

+0

控件退出该方法并停止调试器。但是,当我以调试模式再次运行该方法时,它会看到缓存为空并进入if子句。 Visual Studio IDE仍处于开放状态。我假设缓存应该保留,因为我的过期时间设置为1小时,并且不可移除。 – user766237

+0

我认为问题在于,虽然您已将其设置为一小时而不可移除;你从静态方法中这样做,这意味着当调试器分离并且垃圾收集时缓存的上下文消失。我只是理论,虽然... –

回答

1

MemoryCache的寿命不是在所有的Visual Studio捆绑(您的评论提到:“Visual Studio IDE中仍然是开放的。”

程序运行仅在缓存中是可用的,所以每个当你停止并重新启动你的应用程序时,缓存实际上是空的,更具体地说,它存在于你的应用程序启动时创建的AppDomain的环境中,运行超过一个小时,该政策会产生什么影响。

+0

这是令人惊讶的,也令人困惑。当我通过QTP自动化工具实例化相同的MemoryCache并以120分钟的滑动截止时间将某些内容添加到缓存中时,在我运行我的方法时甚至在方法结束后,它都可用。当我从QTP重新运行该方法时,我能够再次看到它。所以,当我从Visual Studio做同样的事情时,有些东西是不正确的。 – user766237

+0

@ user766237如果QTP是一个基于网络的工具,那么在Web主机运行时,缓存将处于活动状态。当你开始通过Visual Studio进行调试时,一个“lite”Web服务器(Cassini)作为另一个进程加速并承载项目的服务器端。通过该运行,您可以针对服务器组件的相同运行实例反复调试前端。因此,即使您正在启动和停止前端,该服务器组件中的高速缓存仍处于活动状态,直到您关闭它为止。 – Jay

+0

编号QTP(Quick Test Pro)是在Windows 7上运行的桌面应用程序。它与Visual Studio相同。 – user766237