我有一个存储库修饰器。这个装饰器负责装饰存储库的缓存。在这个装饰器的大部分函数中,我只是返回缓存的结果(如果存在),或者调用装饰存储库上的方法,并将此结果存储在缓存中(如果尚未存在于此缓存中)。我做那个安全。C# - 缓存加载缓存
但我想做这个例程获取缓存锁,...在一个单一的方法,并调用它与lambda表达式。
我的方法得到结果的缓存或加载:
private X CallCachedAndLocked<X>(string methodCacheKey, xxx methodToCallWithParameter)
{
var cacheKey = GetCacheKey(methodCacheKey);
X obj = (X)Cache.Get(cacheKey);
if (obj == null)
{
lock (getLastDrawResult_lock)
{
if (obj == null)
{
obj = methodToCallWithParameter;
if (obj != null)
{
Cache.Add(cacheKey,
obj,
null,
NextExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
CacheItemPriority.AboveNormal, null);
}
}
}
}
}
调用的例子:
public T GetDraw(int id)
{
return CallCachedAndLocked<T>(() => _decoratedRepository.GetDraw(id));
}
public IEnumerable<T> GetDraws(DateTime from)
{
return CallCachedAndLocked<T>(() => _decoratedRepository.GetDraws(GetDraws));
}
你想传递的关键和lambda,或lambda只? – 2014-09-29 12:42:19
我不认为你需要这里的双重检查锁。 obj是一个局部变量,它在堆栈中,不会被共享等等。不是吗? – ziya 2014-09-29 12:55:36
我不完全明白这个问题。底层存储库调用是否需要同步发生? – ziya 2014-09-29 12:58:53