【问题标题】:MemoryCache does not work after several minutes几分钟后 MemoryCache 不起作用
【发布时间】:2013-05-15 05:26:03
【问题描述】:

这是我的代码:

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

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

【问题讨论】:

  • 能解释一下宿主进程吗?它是作为托管在 IIS 中的 Web 应用程序运行,还是作为 Windows 服务运行?
  • 宿主进程是IIS 7中的web应用,操作系统是win 7

标签: c# memorycache


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多