2011-09-05 2 views
1

캐시 된 항목을 새로 고치기 위해 파일을 트리거로 사용하려고합니다. 파일이 변경되면 이벤트가 발생합니다 (파일이 변경 될 때마다). 현재 HostFileChangeMonitor 클래스를 사용하고 있습니다. 다음은 캐시 항목이 파일에 연결하기 위해 정책을 사용하여 설정됩니다 어디 :캐싱 및 반복적으로 실행 NotifyOnChanged

private static void SetPolicy(CacheNames cacheName, CacheItem item) 
    { 
     string strCacheName = cacheName.ToString(); 
     CacheItemPolicy policy; 
     if (_policies.TryGetValue(strCacheName, out policy)) 
     { 
      _cacheObject.Set(item, policy); 
      return; 
     } 
     policy = new CacheItemPolicy(); 
     List<string> filePaths = new List<string> { 
      string.Format(@"{0}\{1}.txt",Config.AppSettings.CachePath,cacheName.ToString()) 
     }; 
     var changeMonitor = new HostFileChangeMonitor(filePaths); 
     _cacheObject.Set(item, policy); 
     changeMonitor.NotifyOnChanged(new OnChangedCallback(RefreshCache)); 
     policy.ChangeMonitors.Add(changeMonitor); 
    } 

NotifyOnChanged 화재 한 번만 그러나. 이 할 수있는 더 나은 방법이

private static void RefreshCache(object state) 
    { 
     //remove from cache 
     WcfCache.ClearCache("Refreshed"); 
     //resubscribe to NotifyOnChanged event 
     WcfCache.SetCache("Refreshed", true, CacheNames.CacheFileName); 
     //grab all cache data and refresh each in parallel 
} 

있습니까 : 그 때문에, 나는 현재 재 부가 ​​NotifyOnChanged에 의해 호출 된 RefreshCache 방법에 캐시에 항목을 삭제 한 후 무엇입니까? NotifyOnChanged와 같은 처음 시간이 아닌 항상 불이 들어올 수있는 이벤트가 있습니까? 이것은 꽤 허약 해 보인다. HostFileChangeMonitor가 한 번 올바르게 추가되지 않으면 전체 앱의 캐시가 새로 고침되지 않습니다.

답변

1

FileSystemWatcher을 시도하고 Change 이벤트를 처리 해 보셨습니까? 여기에 더 자세한 내용은 MSDN's documentation입니다.

+1

이전에는 사용하지 않았습니다. 즉, [이 게시물] (http://stackoverflow.com/questions/1764809/filesystemwatcher-changed-event-is-raised-twice)와 함께 사용하면 올바르게 설정할 수 있습니다. 감사! – DougJones

0

방금이 클래스를 발견 했으므로 NotifyOnChanged는 감시 된 파일이 업데이트 될 때마다 (이름에서 다르게 생각할 수 있음에도 불구하고) 실행되지 않습니다. 오히려 파일이 지속적으로 감시되고 캐싱되고 필요할 때마다 캐시에서 가져와야합니다.