基于企业库读取/写入共享缓存

时间:2011-09-16 06:41:48

标签: c# caching enterprise-library

我正在使用Enterprise Lib 5.0缓存应用程序块,我正在尝试找出在多线程场景中处理读/写的最佳方法。 是否锁定了写入并且没有锁定读取推荐的方法?

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”设置一个“键”字典是否有意义,这样你基本上只能锁定一个特定的键,而不是像Web应用程序这样的多线程场景中的“常用”锁:

基本上是这样的:

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

1 个答案:

答案 0 :(得分:3)

您不应该使用The Caching Application Block进行自己的锁定,因为“您确信该块以线程安全的方式执行”。

如果您查看Cache的源代码,您会看到AddRemoveGetData方法都获取内存中的锁定在执行任何操作之前缓存。