2011-10-12 44 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(依賴)是什麼,從原崗位缺失。