5

依存している他のエントリに変更が加えられたときに、MemoryCacheからエントリを削除しようとしています。これは、依存キーへの依存関係のキャッシュエントリ変更モニターを作成することによって設定されています。

public bool AddToCache(string key, object dataItem, 
    DateTimeOffset absoluteExpiration, IEnumerable<string> dependencyKeys)
{
    bool result = false;

    if (!string.IsNullOrWhiteSpace(key) && dataItem != null)
    {
        CacheItemPolicy policy = new CacheItemPolicy {
            AbsoluteExpiration = absoluteExpiration
        };

        if (masterKeys != null && masterKeys.Any())
        {
            policy.ChangeMonitors.Add(
                this.provider.Cache.
                    CreateCacheEntryChangeMonitor(dependencyKeys));

            foreach (ChangeMonitor monitor in policy.ChangeMonitors)
            {
                monitor.NotifyOnChanged(this.OnDependencyChanged);
            }
        }

        result = this.provider.Cache.Add(key, dataItem, policy);
    }

    return result;
}

OnChangedCallBack方法は次のとおりです。

private void OnDependencyChanged(object state)
{
    // what do I do here as "state" is always null?
}

アイテムは意図したとおりにキャッシュに追加されOnDependencyChanged、監視対象のキーに変更が加えられると、メソッドは期待どおりに呼び出されますが、渡される「状態」インスタンスは常にnullであるため、キャッシュについて何も知りません。依存関係が変更されたため、計画された削除を実行できないキー。

私はここで何かを逃したことがありますか、私はこれをすべて間違った方法で行っていますか?

4

3 に答える 3

6

でパラメータとして使用されるデリゲートOnChangedCacheEntryは次のとおりです。

public delegate void OnChangedCallback(object state);

したがって、次のように呼び出す必要があります。

monitor.NotifyOnChanged(delegate {
       OnChangedCacheEntry(OnDependencyChanged(dependencyKeys)); });

そして、OnDependencyChangedの依存関係キーにアクセスできるようになります

private void OnDependencyChanged(object state)
{
    IEnumerable<string> dependencyKeys = (IEnumerable<string>) state;
}
于 2012-07-13T17:16:17.790 に答える
3

私はそれが古いスレッドであることを知っています、しかしこれが私が持っているものであり、それはうまくいくようです。

...

if (dependencies != null)
{
    var monitor = MemoryCache.Default.CreateCacheEntryChangeMonitor(dependencies);
    monitor.NotifyOnChanged(delegate { OnChangedCallback(dependencies); });
    policy.ChangeMonitors.Add(monitor);
}

...

private static void OnChangedCallback(object state)
{
    var keys = (IEnumerable<string>) state;
    if (keys != null)
        Logger.InfoFormat("callback - {0}", string.Join("|", keys.ToArray()));
    else
        Logger.InfoFormat("callback - null");
}

OnChangedCallback(dependencies )の依存関係パラメーターは、元の投稿から欠落しているものです。

于 2014-03-20T22:26:34.297 に答える
0

OPが述べたように、実行したいのがEvict依存エントリだけであると仮定すると、NotifyOnChangedについて心配する必要はありません。必要なのはこれだけです。

public bool AddToCache(string key, object dataItem,
    DateTimeOffset absoluteExpiration, IEnumerable<string> dependencyKeys)
{
    CacheItemPolicy policy = new CacheItemPolicy();
    policy.AbsoluteExpiration = absoluteExpiration;

    ChangeMonitor monitor = MemoryCache.Default.CreateCacheEntryChangeMonitor(dependencyKeys);
    policy.ChangeMonitors.Add(monitor);

    return MemoryCache.Default.Add(key, dataItem, policy);
}
于 2019-11-05T10:38:57.170 に答える