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提供以安全方式访问密钥的方法,而不是自己编写所有这些锁,甚至允许您提供一个委托,以便在缺少密钥时重新填充条目.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。