我正在使用System.Runtime.Caching.MemoryCache
提供的缓存。
我想枚举缓存的项目,以便我可以无效(逐出然后重新加载)项目
foreach (var item in MemoryCache.Default) { item.invalidate() }
但官方文件found here声明:
!重要:检索MemoryCache实例的枚举器是一个 资源密集型和阻塞操作。因此,调查员应该 不得用于生产应用。
当然必须有一种简单而有效的方法来迭代缓存的项目吗?
答案 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)
希望这有助于某人。