在AppFabric中使用锁定的正确方法是什么

时间:2014-11-27 09:44:22

标签: c# .net wcf caching appfabric

我有一项服务,每四小时更新一次包含8000个对象的AppFabric缓存。它读取一个表,从每个记录创建一个对象并将其存储在缓存中。

当缓存正在更新时,消费者仍然可以从缓存中请求对象。关于这一点的信息不多,所以我想知道以下代码是否是在appfabric中锁定和存储缓存对象的正确方法,而其他线程可以查询缓存:

// caching part
private static void CacheDealers(Dictionary<Key<string>, Dealer> dealers)
{
  DataCache cache = Cache.Instance.DealerCache;

  foreach (Key<string> key in dealers.Keys) {
    CacheObject(cache, key.ToString(), dealers[key], mDealerRegionName);
  }
}

    private static void CacheObject(DataCache cache, string key, object obj, string region)
    {
      DataCacheLockHandle lockHandle;

      if (cache.GetAndLock(key, TimeSpan.FromSeconds(10), out lockHandle) == null)
      {
        cache.Put(key, obj, TimeSpan.MaxValue, region);
      }
      else
      {
        cache.PutAndUnlock(key, obj, lockHandle, TimeSpan.MaxValue, region);
      }
    }

    // retrieve part
    public Dealer GetDealer(string lab, string number) {
      Dealer dealer = (Dealer)Cache.Instance.DealerCache.Get(new Key<string>(lab, number).ToString(), mDealerRegionName);
      return dealer;
    }

1 个答案:

答案 0 :(得分:1)

仍然可以从缓存中读取锁定的项目(虽然锁定它将返回原始对象,而不是更新的对象),因此在更新缓存时,GetDealer方法应该继续工作。来自MSDN

  

常规获取方法调用未被阻止,并始终访问最新   缓存对象的版本