C# 什么';这是在AppFabric中使用锁定的正确方法

C# 什么';这是在AppFabric中使用锁定的正确方法,c#,.net,wcf,caching,appfabric,C#,.net,Wcf,Caching,Appfabric,我有一项服务,每四小时更新8000个对象的AppFabric缓存。它读取一个表,从每个记录创建一个对象,并将其存储在缓存中 当缓存正在更新时,消费者仍然可以从缓存中请求对象。关于这方面的信息不多,因此我想知道以下代码是否是在appfabric中锁定和存储缓存对象的正确方法,而其他线程可以查询缓存: // caching part private static void CacheDealers(Dictionary<Key<string>, Dealer> dealers

我有一项服务,每四小时更新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;
    }
//缓存部分
私人静态经销商(字典经销商)
{
DataCache cache=cache.Instance.DealerCache;
foreach(经销商中的钥匙。钥匙){
CacheObject(cache,key.ToString(),delders[key],mDealerRegionName);
}
}
私有静态void CacheObject(数据缓存缓存、字符串键、对象对象对象、字符串区域)
{
DataCacheLockHandle锁柄;
if(cache.GetAndLock(key,TimeSpan.FromSeconds(10),out lockHandle)==null)
{
cache.Put(key,obj,TimeSpan.MaxValue,region);
}
其他的
{
cache.PutAndUnlock(key,obj,lockHandle,TimeSpan.MaxValue,region);
}
}
//取回零件
公共经销商GetDealer(字符串实验室,字符串编号){
Dealer Dealer=(Dealer)Cache.Instance.DealerCache.Get(新密钥(实验室,编号).ToString(),mDealerRegionName);
退货经销商;
}

锁定的项目仍然可以从缓存中读取(尽管锁定时它将返回原始对象,而不是更新的对象),因此更新缓存时,您的
GetDealer
方法应继续工作。发件人:

常规Get方法调用不会被阻止,并且始终访问最新的 缓存对象的版本