【发布时间】:2016-12-30 11:23:57
【问题描述】:
查看MemoryCache 的文档,我预计如果在到期期限内访问对象,则该期限将被刷新。老实说,我想我是从“滑动”这个名字中推断出来的。
但是,从这个测试中可以看出
[Test]
public void SlidingExpiryNotRefreshedOnTouch()
{
var memoryCache = new MemoryCache("donkey")
{
{
"1",
"jane",
new CacheItemPolicy {SlidingExpiration = TimeSpan.FromSeconds(1) }
}
};
var enumerable = Enumerable.Repeat("1", 100)
.TakeWhile((id, index) =>
{
Thread.Sleep(100);
return memoryCache.Get(id) != null; // i.e. it still exists
})
.Select((id, index) => (index+2)*100.0/1000); // return the elapsed time
var expires = enumerable.Last(); // gets the last existing entry
expires.Should().BeGreaterThan(1.0);
}
无论对象是否已被访问,它都会失败并表现出一旦 TimeSpan 完成,对象就会被弹出的行为。 Linq 查询在 enumerable.Last(); 语句中执行,此时它只会在缓存未过期时执行。一旦它停止列表中的最后一个项目,将指示该项目在缓存中的生存时间。
为了清晰 这个问题是关于 MemoryCache 的行为。不是 linq 查询。
这是其他人的期望吗(即到期不会随着每次触摸而滑动)? 是否有一种模式可以延长被“触摸”的对象的生命周期?
更新我发现即使我在缓存周围写了一个包装器并在每次检索它时将对象重新添加回缓存,另一个 SlidingExpiration 它仍然只尊重初始设置。为了让它以我想要的方式工作,我必须在重新添加之前从缓存中物理删除它!这可能会导致多线程环境中出现不良竞争条件。
【问题讨论】:
-
也许你想把这个问题分成两半?
MemoryCache使用有问题,还是 Linq 使用有问题?
标签: c#