MemoryCache类公开了一个名为.AddOrGetExisting的方法,如果存在则是一种线程安全的方法,如果它不存在则添加。
如果缓存的对象尚不存在,则此方法返回NULL
。我想我理解这个的价值,因为它向用户提供关于它在缓存中的存在的反馈。
我的缓存解析器如下所示:
private static T GetCachedCollection<T>(Guid cacheKey, Lazy<T> initializer)
{
return (T) (MemoryCache.Default.AddOrGetExisting(cacheKey.ToString(), initializer.Value, _policy) ?? initializer.Value);
}
我想要完成的是除非需要,否则不会创建对象,如果需要,我不想构建它两次。
我担心的是,当我将.Value
类型的Lazy
作为参数传递时,无论是否在缓存中找到该项,它都可以调用初始值设定项。但是,如果我正确理解JIT,它将传递方法的委托,不调用它。
我应该如何实现这些目标:
答案 0 :(得分:7)
不要将对象存储在缓存中,存储Lazy
。
private static T GetCachedCollection<T>(Guid cacheKey, Lazy<T> initializer)
{
var cachedValue = (Lazy<T>)(MemoryCache.Default.AddOrGetExisting(
cacheKey.ToString(), initializer, _policy) ?? initializer);
return cachedValue.Value;
}