私はSystem.Runtime.MemoryCache
Web サービス統合レイヤーで を使用して、外部にあり取得が遅い製品リストを保持しています。ただし、有効期限が切れたときにそれらを更新して、発信者がそれを待たないようにしたいと考えています。そのため、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];
}
}
}
}