如何安全地清除ASP.NET缓存线程?

时间:2015-10-05 15:53:20

标签: c# asp.net .net multithreading

在我的项目中,我使用单例模式实现了一些缓存值 - 它看起来像这样:

Roles GetRoles
{
get{
         var cached = HttpContext.Current.Cache["key"];
         if(cached == null){
             cached = new GetRolesFromDb(...);
         }
         return cached as Roles;
   }
}    

当我更改角色时,我清除缓存(迭代所有键)。 我认为它不是线程安全的 - 如果某些请求尝试获取缓存的角色, 缓存!= null并且同时缓存已被清除GetRoles返回null。

1 个答案:

答案 0 :(得分:1)

private object lockRoles = new object();

public Roles GetRoles
{
  get 
  {
    object cached = HttpContext.Current.Cache["key"];
    if(cached == null) 
    {
      lock(lockRoles)
      {
        cached = HttpContext.Current.Cache["key"];
        if (cached == null) 
        {
          cached = new GetRolesFromDb(...);
          HttpContext.Current.Cache["key"] = cached; 
        }
      }
    }
    return (Roles)cached;
  }
}    

public void ClearRoles()
{
  HttpContext.Current.Cache.Remove("key");
}