2011-10-12 5 views
5

종속성이있는 다른 항목이 변경되면 MemoryCache에서 항목을 제거하려고합니다. 이는 종속 키에 대한 종속성을 캐시 엔트리 변경 모니터를 생성하여 설정되고 :MemoryCache - 종속성이 변경되면 종속 캐시 항목을 제거하는 방법

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

의도 한대로 항목 캐시에 추가되고 :

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 방법이있다 OnDependencyChanged 메서드는 모니터링 된 키가 변경 될 때 예상대로 호출되지만 전달 된 "상태"인스턴스는 항상 null이므로 종속성이 변경되어 수행 할 수없는 캐시 키에 대해 아무것도 모른다는 것을 의미합니다. 계획 퇴거.

내가 여기에 뭔가를 놓친 적이 있습니까?이 모든 잘못된 길로 가고 있습니까?

+2

안녕하세요 Jibberish, 올바른 답변을 표시 했는데도 대답이 옳은 이유를 이해할 수 없습니다. 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의 종속 매개 변수 (종속)는 원래의 게시물에서 빠진 것입니다.