2013-05-15 55 views
0

這裏是我的代碼:的MemoryCache不幾分鐘後工作

public class ConfigCache 
{ 
    private static volatile ObjectCache _cache = MemoryCache.Default; 
    private const string KeyModule = "MODULE_XDOC_KEY"; 
    private static string _settingFile; 

    public ConfigCache(string file) 
    { 
     _settingFile = file; 
    } 

    public XDocument Get() 
    { 
     var doc = _cache[KeyModule] as XDocument; 
     if (doc == null) 
     { 
      doc = XDocument.Load(_settingFile); 
      var policy = new CacheItemPolicy(); 
      var filePaths = new List<string> {_settingFile}; 
      policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths)); 
      var callback = new CacheEntryRemovedCallback(this.MyCachedItemRemovedCallback); 
      policy.RemovedCallback = callback; 
      _cache.Set(KeyModule, doc, policy); 
     } 

     return _cache[KeyModule] as XDocument; 
    } 

    private void MyCachedItemRemovedCallback(CacheEntryRemovedArguments arguments) 
    { 
     // Log these values from arguments list 
    } 
} 

當碰上_cache.Set()第一次,它工作正常:

  • _cache.Set()效果很好,它將xdoc添加到緩存中。

但幾分鐘後,(1或2分鐘),緩存將不再工作:

  • _cache.Set()不插入任何東西緩存
  • _cache.Set()不報告任何錯誤。
  • 回調MyCachedItemRemovedCallback從未觸發。

有人遇到同樣的問題: MemoryCache always returns "null" after first expiration

,但似乎還沒有解決。任何人都有這個想法嗎?

+0

您能解釋主機進程嗎?它是作爲託管在IIS中的Web應用程序運行的,還是Windows服務? – CaptDialup

+0

主機進程是在IIS 7中的Web應用程序,OS是贏7 – user2384171

回答

0

您的問題可能是緩存處置。這將導致MemoryCache悄悄地返回null而不是拋出任何異常。首先搜索你的代碼,以確保你沒有處置它。如果你確定你沒有處理它,請嘗試打破AppDomain.UnhandledException事件。 MemoryCache訂閱這一事件(見this answer並配置本身。如果你在你的應用程序作爲一個全球性的錯誤處理程序處理UnhandledException事件,這可能是問題。

如果是這樣的問題,一個簡單的解決方法是處理(請參閱我的回答here