我可以遍历.NET4 MemoryCache吗?

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

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

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

但这里发现的官方文件说明:

!重要:检索MemoryCache实例的枚举器是一项资源密集型和阻塞操作。 因此,不应在生产应用程序中使用枚举器。

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

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

因此,如上所述,我已经向我的缓存适配器类添加了一个列表,该类包含对我放在缓存中的每个项目的引用。 如果我需要迭代缓存 – 不仅仅是为了失效,而是为了收集统计数据等 – 然后我迭代我的列表。

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

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

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

请参阅System.Runtime.Caching中是否存在某种CacheDependency?

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

2014年

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

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

希望这有助于某人。