C # 4.0 MemoryCache - как изгнать зависимые записи кэша, когда вносятся изменения в их зависимости - PullRequest
5 голосов
/ 12 октября 2011

Я пытаюсь удалить записи из 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 вызывается, как и ожидалось, когда вносится изменение в отслеживаемый ключ, однако переданный ему экземпляр «state» всегда имеет значение null, что означает, что Я ничего не знаю о ключе кэша, зависимость которого изменилась, и поэтому не могу выполнить запланированное выселение.

Я что-то здесь упустил, я все это делаю неправильно?

Ответы [ 2 ]

6 голосов
/ 13 июля 2012

Делегат, который используется в качестве параметра в 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;
}
3 голосов
/ 21 марта 2014

Я знаю, что это старая ветка, но вот что у меня есть, и похоже, что она работает.

...

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 ( зависимостей ) - это то, что отсутствует в исходном сообщении.

...