我正在尝试使用文件作为触发器来刷新缓存的项目。当文件被更改时,我需要触发一个事件(每次文件更改时)。我目前正在使用HostFileChangeMonitor类。以下是使用策略将缓存项设置为文件的位置:
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没有正确添加一次,整个应用程序的缓存将永远不会刷新。
答案 0 :(得分:1)
您是否尝试过FileSystemWatcher
并处理其Change
事件?有关详细信息,请参阅此处MSDN's documentation。
答案 1 :(得分:0)
我刚刚发现了这个类,并且从我得到的结果来看,每次更新监视文件时都不会触发NotifyOnChanged(即使名称让你不这么认为)。 相反,文件经常被监视和缓存,您只需要在需要时从缓存中获取它。