Я пытаюсь использовать файл в качестве триггера для обновления моих кэшированных элементов. Когда файл меняется, мне нужно запустить событие (каждый раз, когда файл меняется). В настоящее время я использую класс 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 срабатывает только один раз. Из-за этого я в настоящее время удаляю, а затем повторно добавляю элемент в кеш в методе RefreshCache, вызываемом 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)? Это кажется довольно хрупким. Если HostFileChangeMonitor не будет добавлен должным образом один раз, кэш всего приложения никогда не обновится.