C#将锁定对象传递给通用缓存访问方法

时间:2013-03-28 12:23:46

标签: c# generics static locking scope

我在单例类中有一个通用缓存访问方法,它接受三个参数。

  1. 委托(无参数的void返回类型)
  2. 缓存标签
  3. 用于停止并发缓存设置的锁定对象
  4. 见下文:

    protected delegate T GetDataMethod<T>();
    
    
    protected override D GetCachedData<D>(GetDataMethod<D> dataAccessMethod, string cachelabel, object lockObject)
        {
    
            if (MemoryCache.Default[cachelabel] == null)
            {
                lock (lockObject)
                {
                    //Inside the lock, test once again in case the cache object has been set already
                    if (MemoryCache.Default[cachelabel] == null)
                    {
                        umbraco.BusinessLogic.Log.Add(umbraco.BusinessLogic.LogTypes.Debug, -10, cachelabel + " inside lock, cache empty");
    
                        D data = default(D);
    
    
                            try
                            {
                                data = dataAccessMethod();
                            }
                            catch (Exception ex)
                            {
    
                              //Logging                               
                            }
    
    
    
                        MemoryCache.Default.Add(cachelabel, data, GetCacheItemPolicy());
                    }
                }
            }
    
            return (D)MemoryCache.Default[cachelabel];
        }
    

    我为每个数据集合提供了单独的锁定对象,这些数据集合被缓存设置为静态只读对象。但是,通过将它们传递给方法,它们的范围仅存在于方法中,因此锁定变得无关紧要。

    我不能使用'ref',因为你不能通过ref传递一个静态对象,因为周围的类是一个单例,如果我使锁对象不是静态的,这是否重要?如果可以,任何人都可以推荐一种更好的方法来处理它而不使用基于cacheLabel的switch语句吗?

    编辑: 为了清楚起见,方法足迹:

     protected override D GetCachedData<D>(GetDataMethod<D> dataAccessMethod, string cachelabel, ref object lockObject)
    

    不起作用,因为锁定对象是静态的。我想这个问题确实是 - 在一个单身人士中,锁定对象需要是静态的吗? (是的,它是一个线程安全的单例)

1 个答案:

答案 0 :(得分:1)

我认为您错过了ref关键字的重点 - 您不需要它。您传递的object已经是参考类型。添加ref关键字将使其成为对引用的引用。