编程语言
首页 > 编程语言> > c# – 如何在不实例化不必要的缓存对象的情况下填充MemoryCache?

c# – 如何在不实例化不必要的缓存对象的情况下填充MemoryCache?

作者:互联网

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,它将传递方法的委托而不是调用它.

我该如何实现这些目标:

>如果对象初始值设定项已存在于缓存中,则不要调用它
>如果它不在缓存中,则只调用一次.

解决方法:

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

标签:c,net,lazy-evaluation,memorycache
来源: https://codeday.me/bug/20190612/1224241.html