0

我当前尝试将项目插入MemoryCache.Default实例,该实例工作。但项目不会过期!轮询间隔默认设置为2分钟,对MemoryCache没有进行特定设置。System.Runtime.Caching中的MemoryCache:项目不会过期

添加项目程序是这样的:

string key = "someKey"; 
var faultyItem = GetFaultyItemToBlockFromProcessingTheNextThreeMinutes(); 

if (!MemoryCache.Default.Contains(key)) 
{ 
    MemoryCache.Default.Add(
     new CacheItem(key, faultyItem), 
     new CacheItemPolicy() 
     { 
      AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(3) 
     }); 
} 

然而,项目从来没有在缓存过期!我等了超过10分钟,他们仍然在缓存中。主要目的是通过尝试每隔几秒处理它们来防止它们使查询淹没数据库。他们每隔几秒检查一次,但没有SlidingExpiration。大约3分钟后应该再次检查,5分钟,因为最大延迟仍然是可以容忍的。

我不想在代码之外做任何配置,使用XML等。如果这是不可能的,是否有一个很好的选择MemoryCache?也许用数字/对象键和通过参数和属性进行配置?

+0

您确定您的环境在UTC时区运行吗?你如何“等待”10分钟? – Algirdas

回答

2

我用你的问题的代码片段从头开始设置一个简单的试用应用程序。我所做的唯一修改为如下:var faultyItem = "test";

把手表上的声明MemoryCache.Default.Contains(key)证实,3分钟后,该项目是从缓存中逐出,作为语句返回false

一种可能性是,在您的应用程序的其他位置,您已经使用相同的密钥将一个项目放入MemoryCache中,因为它没有失效,并且永远不会出现新项目这确实有一个绝对到期。除了搜索应用程序之外,测试此应用程序的一种方法是使用命名缓存而不是默认缓存来执行此特定操作,以识别潜在的共享使用情况。即static MemoryCache testCache = new MemoryCache("TestCache")