c# – 如何实现定期缓存重新加载

c# – 如何实现定期缓存重新加载,第1张

概述public class Cache<TKey, TValue> : ICache<TKey, TValue>{ private readonly IDictionary<TKey, TValue> _internalCache; private readonly object _syncLock = new object(); public Cache() {
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# – 如何实现定期缓存重新加载所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1233149.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存