C#4.0 MemoryCache - 如何在对依赖项进行更改时逐出相关的缓存条目

Jas*_*son 5 .net c# caching c#-4.0 memorycache

我试图在对其依赖的其他条目进行更改时从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;
}
Run Code Online (Sandbox Code Playgroud)

OnChangedCallBack方法是这样的:

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

这些项目按预期添加到缓存中,并且在OnDependencyChanged对受监视的键进行更改时按预期调用该方法,但是传递给它的"state"实例始终为null,这意味着我对缓存一无所知密钥的依赖性已经改变,因此不能执行计划的驱逐.

我在这里错过了什么,我是否会以错误的方式解决这个问题?

小智 6

用作参数的委托OnChangedCacheEntry是:

public delegate void OnChangedCallback(object state);
Run Code Online (Sandbox Code Playgroud)

所以你必须这样称呼它:

monitor.NotifyOnChanged(delegate {
       OnChangedCacheEntry(OnDependencyChanged(dependencyKeys)); });
Run Code Online (Sandbox Code Playgroud)

然后,您将可以访问OnDependencyChanged中的依赖项键

private void OnDependencyChanged(object state)
{
    IEnumerable<string> dependencyKeys = (IEnumerable<string>) state;
}
Run Code Online (Sandbox Code Playgroud)