2011-09-05 70 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火災只有一次,但是。正因爲如此,我目前刪除並重新添加項目到緩存由NotifyOnChanged稱爲RefreshCache方法:

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)?這看起來很脆弱。如果HostFileChangeMonitor沒有正確添加一次,整個應用程序的緩存將永遠不會刷新。

回答

1

您是否嘗試過FileSystemWatcher並處理其Change事件?以下是MSDN's documentation關於此主題的更多詳細信息。

+1

我以前沒有用過這個。結合[這篇文章](http://stackoverflow.com/questions/1764809/filesystemwatcher-changed-event-is-raised-twice)使我能夠正確地設置它。謝謝! – DougJones

0

我剛剛發現了這個類,從我得到的結果來看,NotifyOnChanged並不意味着每次觀看文件被更新時都會被解僱(儘管名字可以讓你思考)。 相反,該文件不斷被觀看和緩存,只需要在需要時從緩存中獲取。