我正在使用 Enterprise Lib 5.0 缓存应用程序 block ,并且我正在尝试找出在多线程场景中处理读/写的最佳方法。 推荐的方法是在写入时锁定而不是在读取时锁定吗?
Update(string key, object value)
{
lock(syncLock)
{
cacheManager.Add(key,value);
}
}
object Read(string key)
{
object o = cacheManager.GetData(key);
return o;
}
//OR is the following Read recommended using a lock
object Read(string key)
{
lock(syncLock)
{
object o = cacheManager.GetData(key);
return o;
}
}
我担心的是,如果一个线程即将更新特定键的项目,同时另一个线程即将读取同一键的项目。这会导致竞争吗?
拥有一个“ReaderWriterLockSlim”的“键”字典是否有意义,以便您基本上只对特定键进行锁定,而不是在像网络应用程序这样的多线程场景中使用“公共(public)”锁:
基本上是这样的:
Dictionary<string,ReaderWriterLockSlim> dict = new Dictionary<string,ReaderWriterLockSlim> ();
void Update(string key, object value)
{
dict[key].EnterWriteLock();
cacheManager.Add(key,value);
dict[key].ExitWriteLock();
}
object Read(string key)
{
dict[key].EnterReadLock();
object o = cacheManager.GetData(key);
dict[key].ExitReadLock();
return o;
}
最佳答案
您不必使用 The Caching Application Block 进行自己的锁定因为“您确信该 block 以线程安全的方式执行”。
如果您查看 Cache
的源代码,您将看到 Add
、Remove
和 GetData
方法在执行任何操作之前都会获取内存缓存上的锁。
关于c# - 基于企业库的共享缓存的读/写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7441054/