В подобных ситуациях я использую помощника:
public class CacheUtil
{
private static readonly object locker=new object();
public static T GetCachedItem<T>(string cacheKey,
Func<T> valueCreateFunc,
TimeSpan duration)
{
var expirationTime = DateTime.UtcNow + duration;
var cachedItem = HttpRuntime.Cache[cacheKey];
if (cachedItem == null)
{
lock(locker)
{
cachedItem = HttpRuntime.Cache[cacheKey];
if (cachedItem == null)
{
cachedItem = valueCreateFunc();
HttpRuntime.Cache.Add(cacheKey,
cachedItem,
null,
expirationTime,
Cache.NoSlidingExpiration,
CacheItemPriority.High,
null);
}
}
}
return (T) cachedItem;
}
}
, который я бы использовал примерно так:
CacheUtil.GetCachedItem(
"someUniqueKey",
()=>{ //fetch resource from disk
return value;},
TimeSpan.FromDays(1)
)
Предоставленный делегат будет вызываться только один раз в день.Если элемент уже находится в кэше, делегат больше не будет вызываться.