Кэширование и многократное срабатывание NotifyOnChanged - PullRequest
2 голосов
/ 05 сентября 2011

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

Ответы [ 2 ]

1 голос
/ 05 сентября 2011

Вы пробовали FileSystemWatcher и обрабатывали его Change событие? Вот документация MSDN по теме для получения более подробной информации.

0 голосов
/ 06 октября 2015

Я только что обнаружил этот класс, и из того, что я получил, NotifyOnChanged не должен запускаться каждый раз, когда просматриваемый файл обновляется (даже если имя позволяет думать иначе). Скорее файл постоянно просматривается и кэшируется, и вам просто нужно извлечь его из кэша, когда вам это нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...