firebase deploy
上述缓存由单身包装器使用。以下是实施。
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);
}
}
_internalCache是readonly。它不会让我改变任务。
答案 0 :(得分:1)
_internalCache
是只读的(我假设您不仅要删除readonly
关键字才能使其正常工作)。但这只会影响对列表的引用。您仍然可以替换列表中的项,如下所示:
public void Reload(IDictionary<TKey, TValue> values)
{
lock(_synclock)
{
_internalCache.Clear();
_internalCache.AddRange(values);
}
}
此外,不是自己编写所有这些锁,也许你可以考虑使用ConcurrentDictionary提供以安全方式访问密钥的方法,甚至允许你提供一个委托来重新填充一个密钥条目不见了。
答案 1 :(得分:0)
实际上,您不需要重新创建字典(因为它是只读的)。您可以清除所有值,只需从Clear()
调用IDictionary<TKey, TValue>
方法即可。样本:
public void Reload(IDictionary<TKey, TValue> values)
{
lock (_synclock)
{
_internalCache.Clear();
foreach (var value in values)
_internalCache.Add(value);
}
}