gpt4 book ai didi

C# 重新加载单例缓存

转载 作者:行者123 更新时间:2023-11-30 22:33:15 25 4
gpt4 key购买 nike

我需要一些指示。我有以下键/值缓存:

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);
}
}

这工作正常(我还没有注意到/听说过任何错误......但是 :) )。

但是现在我遇到了一个问题。我需要用新的键/值重新加载缓存。

问题 1.) 我可以实现一个重新加载缓存(Cache 类中的 Dictionary)的“安全”重新加载方法吗?

例如:

    public void Reload(IDictionary<TKey, TValue> values)
{
lock (_syncLock)
{
_internalCache.Clear();
foreach (KeyValuePair<TKey, TValue> value in values)
{

/* Problems can (will) occur if another
thread is calling the GetAll method... */
_internalCache[value.Key] = value.Value;
}
}
}

问题 2.) 我应该改用某些 IoC 容器还是其他库?

谢谢!

注意:我使用的是 .NET 3.5

最佳答案

使用ConcurrentDictionary ,那么你就不必处理同步了。

此外,您也不想重新加载所有缓存项。相反,你想做惊人的,按需将缓存对象加载到键/值存储中。

您可以为此使用时间戳或某些版本控制。如果您为每个键/值对重新加载数据,那么您就不必锁定整个集合。

我真的推荐你使用 ConcurrentDictionary。

关于C# 重新加载单例缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8403782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com