public class Cache<TKey,TValue> : ICache<TKey,TValue>{ private Readonly IDictionary<TKey,TValue> _internalCache; private Readonly object _syncLock = new object(); public Cache() { _internalCache = new Dictionary<TKey,TValue>(); } public TValue this[TKey key] { get { lock (_syncLock) { //... } } set { lock (_syncLock) { //... } } } public ICollection<TValue> GetAll() { lock (_syncLock) { return _internalCache.Values; } } public bool ContainsKey(TKey key) { lock (_syncLock) { return _internalCache.ContainsKey(key); } }}
上述缓存由单例包装器使用.以下是实施.
public class ActivityCache : ICache<string,Activity> { private Readonly ICache<string,Activity> _cache = new Cache<string,Activity>(); private static Readonly ActivityCache _instance = new ActivityCache(); // http://www.yoda.arachsys.com/csharp/singleton.HTML static ActivityCache() { } ActivityCache() { } public static ActivityCache Instance { get { return _instance; } } public Activity this[string activityUrl] { get { if (string.IsNullOrEmpty(activityUrl)) { return null; } return _cache[activityUrl]; } set { if (string.IsNullOrEmpty(activityUrl)) { return; } _cache[activityUrl] = value; } } public ICollection<Activity> GetAll() { return _cache.GetAll(); } public bool ContainsKey(string key) { return _cache.ContainsKey(key); }}
现在我的问题是,如果我想重新加载缓存,我可以使用以下?我希望无缝重新加载,以便线程可以访问陈旧信息.
public voID Reload(IDictionary<TKey,TValue> values){ cache = new Dictionary<TKey,TValue> (); foreach (keyvaluePair<TKey,TValue> value in values) { cache[value.Key] = value.Value; } lock (_syncLock) { _internalCache = cache; }}
_internalCache是Readonly.它不会让我改变任务.
解决方法 _internalCache是只读的(我假设您不只是想删除Readonly关键字以使其工作).但这只会影响对列表的引用.您仍然可以替换列表中的项目,如下所示:public voID Reload(IDictionary<TKey,TValue> values){ lock(_synclock) { _internalCache.Clear(); _internalCache.AddRange(values); }}
此外,您可以考虑使用ConcurrentDictionary提供以安全方式访问密钥的方法,而不是自己编写所有这些锁,甚至允许您提供一个委托,以便在缺少密钥时重新填充条目.
总结以上是内存溢出为你收集整理的c# – 如何实现定期缓存重新加载全部内容,希望文章能够帮你解决c# – 如何实现定期缓存重新加载所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)