2013-06-19 37 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