我可以遍历.NET4 MemoryCache吗?

时间:2011-11-05 21:50:51

标签: c# asp.net caching .net-4.0

我正在使用System.Runtime.Caching.MemoryCache提供的缓存。

我想枚举缓存的项目,以便我可以无效(逐出然后重新加载)项目

foreach (var item in MemoryCache.Default) { item.invalidate() }

但官方文件found here声明:

  

!重要:检索MemoryCache实例的枚举器是一个   资源密集型和阻塞操作。因此,调查员应该   不得用于生产应用。

当然必须有一种简单而有效的方法来迭代缓存的项目吗?

3 个答案:

答案 0 :(得分:10)

到目前为止提出的建议很棒,但我仍然需要说明:迭代缓存的项目。这似乎是一个如此简单的任务,我希望缓存内部还有某种列表结构。 MemoryCache的文档和功能集都很缺乏。

正如上面所讨论的,我已经在我的缓存适配器类中添加了一个列表,该类包含对我放在缓存中的每个项目的引用。如果我需要遍历缓存 - 不仅仅是为了失效,而是为了收集统计数据等 - 然后我遍历我的列表。

如果缓存中放置的项目数没有变化,那么这是一个合理的解决方案。如果数字确实发生了变化,那么您需要通过适配器类插入/删除,以便使列表与实际缓存保持同步。凌乱但它有效,并且避免了文档中提到的性质惩罚。

希望MemoryCache缓存提供程序将在下一个平台版本中充实。

答案 1 :(得分:1)

考虑使用ChangeMonitors,它允许您在满足特定条件时自动驱逐陈旧条目。

请参阅Is there some sort of CacheDependency in System.Runtime.Caching?

这类似于System.Web.Caching CacheDependencys,它允许您在文件或其他缓存条目更改时逐出条目。

答案 2 :(得分:-2)

2014年,

这是获取所有项目的正确方法:

Dim AllItems = MemoryCache.Default.Select(Of ItemType)(Function(O) O.Value)

希望这有助于某人。