【发布时间】:2012-06-17 03:33:10
【问题描述】:
我有一个使用静态类作为缓存的 ASP.NET 应用程序。该静态类内部是内部字典,其中包含缓存的对象。当然,静态类中还有 Add/Remove/Clear 之类的方法...看起来如下:
public static class CacheManager
{
private static Dictionary<string, object> cacheItems = new Dictionary<string, object>();
private static ReaderWriterLockSlim locker = new ReaderWriterLockSlim();
public static Dictionary<string, object> CacheItems
{
get
{
return cacheItems;
}
}
public static void AddCacheItem(string key, object data)
{
locker.EnterWriteLock();
try
{
cacheItems.Add(key, data);
}
finally
{
locker.ExitWriteLock();
}
}
...
}
当 ASP.NET 应用程序运行时,这些项目被添加到缓存(字典)中。我只想问我是否应该在 Add 方法中检查是否已经以这种方式添加了密钥:
public static void AddCacheItem(string key, object data)
{
locker.EnterWriteLock();
try
{
if (!cacheItems.ContainsKey(key))
{
cacheItems.Add(key, data);
}
}
finally
{
locker.ExitWriteLock();
}
}
还是在第一个代码 sn-p 中保持原样?
提前谢谢你。
【问题讨论】:
-
我更关心从
CacheItems属性读取的代码将如何进入读锁... -
你的意思是我也应该放一些同步的东西?
-
ConcurrentDictionary 怎么样。或者你没有使用.Net 4.0? msdn.microsoft.com/en-us/library/dd287191.aspx
-
添加与否对调用者有影响吗?
-
由于您要公开字典,因此所有同步的赌注都已关闭(即使所有读取都已同步),您仍然可以在不同步的情况下添加项目。德墨忒耳法则可以避免您可能面临的问题的一个很好的例子
标签: c# asp.net dictionary add