1

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

1 に答える 1