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对受监视的键进行更改时按预期调用该方法,但是传递给它的“状态”实例始终为空,这意味着我对缓存一无所知依赖项已更改并因此无法执行计划驱逐的键。

我在这里错过了什么吗,我是不是走错了路?

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 ) 中的dependencies参数是原始帖子中缺少的。

于 2014-03-20T22:26:34.297 回答
0

假设您想要做的只是逐出相关条目,如 OP 所述,您无需担心 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 回答