c# - 我应该如何在不实例化不必要地缓存的对象的情况下填充 MemoryCache?

标签 c# .net lazy-evaluation memorycache

MemoryCache类公开了一个名为 .AddOrGetExisting 的方法这是一种线程安全的方法,如果存在则获取,如果不存在则添加。

如果缓存对象不存在,此方法返回 NULL。我想我理解它的值(value),因为它向用户提供了关于它在缓存中的存在的反馈。

我的缓存解析器如下所示:

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,它将传递方法的委托(delegate)并且不会调用它。

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

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

最佳答案

不要将对象存储在缓存中,存储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# - 我应该如何在不实例化不必要地缓存的对象的情况下填充 MemoryCache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26533612/

相关文章:

c# - Azure 存储 Rest API(放置 Blob API)

c# - 使用 OpenFileDialog 选择文件和文件夹

c# - 使用 MSBuildWorkspace 加载解决方案和项目时出现诊断错误

.net - 设置 Cookie 端口

javascript - 有什么方法可以为 Javascript 数组中的惰性变量定义 getter?

list - 哪种语言理解 'variable a = 0 , 20, ..., 300' ?

c# - 如何将文件写入 Internet Explorer Mobile 的响应?

c# - IHttpAsyncHandler.EndProcessRequest 中的 IAsyncResult 可能为 null 吗?

c# - 从 MethodCallExpression 获取投影

python - 我可以导致表达式的惰性评估吗?