c# - 基于企业库的共享缓存的读/写

标签 c# caching enterprise-library

我正在使用 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 的源代码,您将看到 AddRemoveGetData 方法在执行任何操作之前都会获取内存缓存上的锁。

关于c# - 基于企业库的共享缓存的读/写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7441054/

相关文章:

c# - 显示器特定区域的像素搜索

c# - EF 上下文中基于动态角色的身份验证过滤器

c# - 在 C# 中访问 Azure 中系统管理标识的应用程序 ID

php - 如何发送 Akamai 缓存过期 header ?

php - 在 MAMP 服务器上安装 APCu

.net - Silverlight 是否有 log4net 版本?

c# - 作为默认存储日志的 ASP.NET Core 日志记录 API 在哪里?

c - 了解 C 程序的缓存行为

c# - ASP.NET 依赖注入(inject) HTTP 模块(MS 企业库)

logging - Enterprise Library 4.1 日志时间戳如何显示毫秒