SlidingExpiration与MemoryCache看MemoryCache的文档,我期望如果一个对象在Expiration期间被访问,那么它会在该期间被刷新。老实说,我认为我没有从“刷卡”这个名字中推断出任何东西。然而,从这个测试看来[Test]publicvoidSlidingExpiryNotRefreshedOnTouch(){varmemoryCache=newMemoryCache("donkey"){{"1","jane",newCacheItemPolicy{SlidingExpiration=TimeSpan.FromSeconds(1)}}};varenumerable=Enumerable.Repeat("1",100).TakeWhile((id,index)=>{Thread.Sleep(100);returnmemoryCache.Get(id)!=null;//即它仍然存在}).Select((id,index)=>(index+2)*100.0/1000);//返回经过的时间varexpires=enumerable.Last();//获取最后一个现有条目expires.Should()。大于(1.0);它会失败并显示对象在TimeSpan完成后被弹出的行为,无论该对象是否已被访问。enumerable.Last();中的Linq查询语句,此时缓存还没有过期。一旦停止,列表中的最后一项将指示该项目在缓存中的时间。为了清楚起见,这个问题是关于MemoryCache的行为。不是linq查询。这是其他人所期望的吗(即到期时间不会随着每次触摸而滑动)?有没有一种模式可以延长“触摸”对象的寿命?更新我发现即使我在缓存周围写了一个包装器并在每次检索对象时将对象重新添加回缓存,另一个SlidingExpiration仍然只支持初始设置。为了让它按照我想要的方式工作,我必须在重新添加之前将其从缓存中删除!这会在多线程环境中导致不希望出现的竞争条件。...newCacheItemPolicy{SlidingExpiration=TimeSpan.FromSeconds(1)}这在MSDN中没有详细记录。你有点倒霉,1秒不够。穿过头发,用2秒钟,您会看到它按照您想要的方式工作。用FromMilliseconds()修补一些,你会发现~1.2秒是这个程序中最快的最小值。解释这个比较复杂,我不得不说说MemoryCache如何避免每次访问缓存时都必须更新幻灯片计时器。正如您所想象的,这是相对昂贵的。让我们走捷径,带你去相关的参考源码。小到可以粘贴在这里:internalvoidUpdateSlidingExp(DateTimeutcNow,CacheExpiresexpires){if(_slidingExp>TimeSpan.Zero){DateTimeutcNewExpires=utcNow+_slidingExp;如果(utcNewExpires-_utcAbsExp>=CacheExpires.MIN_UPDATE_DELTA||是关键,它会阻止调用UtcUpdate()。换句话说,在更新滑动计时器之前,至少必须经过MIN_UPDATE_DELTA时间值。CacheExpired类没有被ReferenceSource索引,这意味着他们对它的工作方式并不完全满意:)但是一个像样的反编译器可以告诉你:staticCacheExpires(){MIN_UPDATE_DELTA=newTimeSpan(0,0,1);MIN_FLUSH_INTERVAL=newTimeSpan(0,0,1);//etc...}换句话说,硬编码为1秒。现在没办法改了,太丑了。这个测试程序中的SlidingExpiration值大约需要1.2秒,因为Thread.Sleep(100)实际上并没有休眠100毫秒,它需要更多的时间。换句话说,将是第11次Get()调用使滑动计时器在该测试程序中滑动。你不是那么远。好吧,这应该记录在案,但我猜这可能会改变。现在,您需要假设实际的滑动过期时间至少应为2秒。以上就是C#学习教程:SlidingExpiration和MemoryCache分享的全部内容。如果对您有用,需要进一步了解C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
