【问题标题】:MemoryCache doesn't store IReadOnlyListMemoryCache 不存储 IReadOnlyList
【发布时间】:2016-09-24 22:06:42
【问题描述】:

我厌倦了将填充的 IReadOnlyList 设置为缓存,但它始终为空:

CacheItemPolicy cip = new CacheItemPolicy(); // no expiration
IReadOnlyList<T> dataList = [populate var]

if (dataList != null)
{
   MemoryCache.Default.Set(_cacheKey, dataList, cip);
}

缓存中没有设置任何内容。但是,如果我将其更改为:

List<T> list = null;
CacheItemPolicy cip = new CacheItemPolicy(); // no expiration
IReadOnlyList<T> dataList = [populate var]

if (dataList != null)
{
   list = dataList.ToList();       
   MemoryCache.Default.Set(_cacheKey, list, cip);
}

它有效。 MemoryCache 是否不支持接口或 IReadOnlyList 对象?

【问题讨论】:

  • 如何填充dataList 列表?
  • 它实际上是在一个函数中传递的,为了保持示例简单,我删除了包装调用的函数。
  • 函数返回的对象的类型是什么? (不是函数返回类型,而是特定情况下返回值的实际类型)。我不认为变量类型很重要,但对象的类型可能很重要。

标签: c# .net .net-4.6 memorycache


【解决方案1】:

MemoryCache 正在缓存第一个示例中对列表的引用以及第二个示例中的列表副本。

一定是您的代码重用了作为 dataList 传入的列表,因此您需要缓存一个副本。调用 ToList() 进行复制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2018-06-10
    相关资源
    最近更新 更多