缓存并重复触发NotifyOnChanged

时间:2011-09-05 03:44:40

标签: caching c#-4.0

我正在尝试使用文件作为触发器来刷新缓存的项目。当文件被更改时,我需要触发一个事件(每次文件更改时)。我目前正在使用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没有正确添加一次,整个应用程序的缓存将永远不会刷新。

2 个答案:

答案 0 :(得分:1)

您是否尝试过FileSystemWatcher并处理其Change事件?有关详细信息,请参阅此处MSDN's documentation

答案 1 :(得分:0)

我刚刚发现了这个类,并且从我得到的结果来看,每次更新监视文件时都不会触发NotifyOnChanged(即使名称让你不这么认为)。 相反,文件经常被监视和缓存,您只需要在需要时从缓存中获取它。