【问题标题】:How should I populate a MemoryCache without instantiating the object to be cached unneccesarily?我应该如何填充 MemoryCache 而无需实例化要缓存的对象?
【发布时间】:2014-10-23 17:13:30
【问题描述】:

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);
}

我想要完成的是,除非需要,否则不会创建对象,如果需要,我不想构造它两次。

我担心的是,当我将Lazy 类型的.Value 作为参数传递时,无论该项目是否在缓存中找到,它都可能调用初始化程序。但是,如果我正确理解 JIT,它将传递方法的委托并调用它。

我应该如何实现这些目标:

  1. 如果对象初始化程序已经存在于缓存中,则不要调用它
  2. 如果它不在缓存中,则只调用一次。

【问题讨论】:

    标签: c# .net lazy-evaluation memorycache


    【解决方案1】:

    不要将对象存储在缓存中,存储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;
    }
    

    【讨论】:

    • 太棒了。不知道我是怎么忽略的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多