.NET 4 ObjectCache - 我们可以陷入"缓存过期"事件吗?

RPM*_*984 16 c# caching .net-4.0 objectcache

我有一个像这样缓存的简单对象:

_myCache.Add(someKey, someObj, policy);
Run Code Online (Sandbox Code Playgroud)

在哪里_myCache声明为ObjectCache(但通过DI注入MemoryCache.Default),someObj是我正在添加的对象,并且policyCacheItemPolicy.

如果我有CacheItemPolicy这样的:

var policy = new CacheItemPolicy 
{ 
   Priority = CacheItemPriority.Default, 
   SlidingExpiration = TimeSpan.FromHours(1)
};
Run Code Online (Sandbox Code Playgroud)

这意味着它将在1小时后到期.凉.

但会发生的事情是,一小时后不幸的第一个用户将不得不等待命中.

有什么方法可以挂钩到"过期"事件/委托并手动刷新缓存?

我看到有一个提到,CacheEntryChangeMonitor但在我的例子中找不到任何有意义的doco /例子如何利用它.

PS.我知道我可以CacheItemPriority.NotRemovable手动使用和过期,但我不能在我当前的例子中这样做,因为缓存的数据有点太复杂(例如,我需要在我的代码中的10个不同位置"无效").

有任何想法吗?

BFr*_*ree 16

CacheItemPolicy被叫的属性RemovedCallback是:CacheEntryRemovedCallback.不知道为什么他们没有走标准的赛道路线,但那应该做你需要的.

http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy.removedcallback.aspx

  • 好吧,该链接不包含代码示例 - 实际上MSDN在运行时缓存的代码示例上非常短.我最终想通了,但你可以通过提供一个例子来节省我一个小时. (4认同)
  • [CodeProject示例](http://www.codeproject.com/Articles/290935/Using-MemoryCache-in-Net-4-0)“在.NET 4.0中使用MemoryCache” (2认同)

小智 5

这次聚会晚了,但是我刚刚注意到CacheItemUpdate和CacheItemRemove回调之间的有趣区别。

http://msdn.microsoft.com/zh-CN/library/system.web.caching.cacheitemupdatereason.aspx

特别是此评论:

与CacheItemRemovedReason枚举不同,此枚举不包括Removed或Underused值。可更新的缓存项不可移动,因此即使需要释放内存,ASP.NET也无法将其自动删除。