我System.Runtime.MemoryCache
在 Web 服务集成层中使用 a 来保留一些外部且检索缓慢的产品列表。但是,我想在它们过期时刷新它们,以使我的呼叫者免于等待。出于这个原因,我正在使用 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];
}
}
}
}