【发布时间】:2011-12-24 00:14:11
【问题描述】:
我使用System.Runtime.Caching.MemoryCache 来保存永不过期的物品。但是,有时我需要清除整个缓存的能力。我该怎么做?
我问了一个类似的问题here,关于我是否可以枚举缓存,但这是一个坏主意,因为它需要在枚举期间同步。
我尝试过使用.Trim(100),但这根本不起作用。
我尝试通过 Linq 获取所有键的列表,但后来我又回到了开始的地方,因为逐个逐出项目很容易导致竞争条件。
我想存储所有密钥,然后为每个密钥发出一个.Remove(key),但那里也有一个隐含的竞争条件,所以我需要锁定对密钥列表的访问,事情变得一团糟再次。
然后我认为我应该能够在整个缓存上调用.Dispose(),但由于它的实现方式,我不确定这是否是最好的方法。
使用ChangeMonitors 不是我的设计选项,而且对于这样一个微不足道的要求来说过于复杂。
那么,如何彻底清除缓存呢?
【问题讨论】:
-
MSDN 明确声明它不是单例:“另一个区别是您可以创建 MemoryCache 类的多个实例,以便在同一个应用程序和同一个 AppDomain 中使用实例。”
-
@MarcGravell 啊!我可能正在查看错误的文档。所以这似乎意味着我可以打电话给
.Dispose(),然后当我打电话给MemoryCache.Default时,我会得到一个全新的实例...... -
只是简单地交换到一个新实例并处理旧的问题?假设同步等
-
否,如果您在默认实例上调用 dispose,则您已经杀死了默认实例。所以...如果您打算使用 Dispose,请不要使用
.Default!不过,这并不能使它成为单例... -
我现在才发现有一个similar question。但围绕
Dispose()的讨论并不完整。
标签: c# asp.net caching .net-4.0