2011-10-12 21 views
5

做我试图从一个的MemoryCache逐出条目更改时其所依赖的其他条目进行。这是正在建立由从属密钥创建缓存条目改变监视的依赖关系:C#4.0的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方法被调用当一个变化被监视键进行预期,但传递给它的“状态”实例总是空,这意味着我一无所知缓存键,其相关性发生了变化,因此无法执行计划的驱逐。

我错过了一些东西在这里,我要对所有这些错误的方法?

+2

嗨Jibberish,您标记正确的答案follwoing,但我仍然无法理解为什么答案是正确的,我甚至不能发现其中OnChangedCacheEntry ......我面临同样的问题,状态始终为空,可以帮助解释再多一点?谢谢! –

回答

5

是在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

我知道这是一个古老的线程,但这是我所拥有的,它似乎工作。

... 

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(依赖)是什么,从原岗位缺失。