几分钟后MemoryCache无法运行

时间:2013-05-15 05:26:04

标签: c# 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

但似乎尚未解决。有人对此有任何想法吗?

1 个答案:

答案 0 :(得分:0)

您的问题可能是缓存正在处理中。这将导致MemoryCache静默返回null而不是抛出任何异常。首先搜索您的代码,以确保您没有处置它。如果您确定没有处理它,请尝试打破AppDomain.UnhandledException事件。 MemoryCache订阅了此活动(请参阅this answer并自行配置。如果您将应用中的UnhandledException事件作为全局错误处理程序处理,则可能是问题所在。

如果这是问题,一个简单的解决方法是处理事件并重新创建缓存的新实例。 (见我的回答here