我有一個存儲庫修飾器。這個裝飾器負責裝飾存儲庫的緩存。在這個裝飾器的大部分函數中,我只是返回緩存的結果(如果存在),或者調用裝飾存儲庫上的方法,並將此結果存儲在緩存中(如果尚未存在於此緩存中)。我做那個安全。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