MemoryCache避免在关机时刷新

时间:2015-02-17 10:00:47

标签: c# code-cleanup application-shutdown

我在Web服务集成层中使用System.Runtime.MemoryCache来保留一些外部且检索速度慢的产品列表。但是,我希望刷新那些过期,以免我的呼叫者等待它。出于这个原因,我使用IIS7.5预先缓存此缓存,并在过期时重新加载数据RemovedCallback

然而,当Web池进程优雅地死亡时会发生什么? MemoryCache是​​一次性的,因此它会将我的对象踢出去,此时我会尝试重新填充一个新实例,同时将整个过程置于保持状态。有没有办法让我安全地检测到我不应该重新加载数据?

internal class ProductCache {
    private static object _lock = new object();
    private static string _cid = Guid.NewGuid().ToString();

    public static Product[] data 
    {
        get
        {
            lock (_lock)
            {
                if (!MemoryCache.Default.Contains(_cid))
                {
                    Product[] p;
                    try
                    {
                        // load data into p
                    }
                    catch (System.Exception e)
                    {
                        Helper.SafeSendExceptionEmail("Integrator.Caching", e);
                        throw e;
                    }
                    MemoryCache.Default.Add(_cid, p, new CacheItemPolicy()
                    {
                        AbsoluteExpiration = DateTimeOffset.Now.AddHours(8),
                        RemovedCallback = arg =>
                        {
                            // query again to force reload
                            var d = data;
                        }
                    });
                }
                return (Product[])MemoryCache.Default[_cid];
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

好的,通过挖掘MemoryCacheMemoryCacheStore源代码,似乎缓存是在域卸载时自动处理的,此时它会处理所有存储,然后使用{删除缓存项{1}}原因。这个原因并没有在其他任何地方使用,因此它必须代表“我正在死”的原因(尽管在文档中它们可能更清晰)

CacheSpecificEviction