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

本文关键字:缓存 访问 方法 对象 | 更新日期: 2023-09-27 18:06:31

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

  1. 一个委托(没有参数的void返回类型)
  2. 一个缓存标签
  3. 一个锁对象,用来阻止并发缓存设置

见下文:

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传递静态对象,因为周围的类是单例的,如果我使锁对象非静态,它会重要吗?如果是这样,谁能推荐一种更好的方法来处理它,而不使用基于cacheabel的switch语句?

编辑:为了清晰起见,方法占用空间:

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

不能工作,因为锁对象是静态的。我想问题真的是-在单例中,锁对象需要是静态的线程安全吗?(是的,这是一个线程安全的单例)

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

我认为你错过了ref关键字的要点——你不需要它。你传递的是一个已经是引用类型的object。添加ref关键字将使其成为引用的引用。