更改ASP.NET缓存项目到期的频率?

Jan*_*ich 12 asp.net caching

我注意到ASP.NET缓存项每20秒检查一次(并且可能被删除)(每次HH时奇怪的是:MM:00,HH:MM:20和HH:MM:40).我花了大约15分钟来查看如何更改此参数而没有任何成功.我还尝试在web.config中设置以下内容,但它没有帮助:

<cache privateBytesPollTime="00:00:05" />
Run Code Online (Sandbox Code Playgroud)

我不是想做任何疯狂的事情,但是如果它是5秒而不是20,或者至少10我的应用程序会很好.

ste*_*son 19

使用Reflector进行探测可以发现间隔是硬编码的.到期由内部CacheExpires类处理,其静态构造函数包含

_tsPerBucket = new TimeSpan(0, 0, 20);
Run Code Online (Sandbox Code Playgroud)

_tsPerBucketreadonly,所以以后不能有任何修改它的配置设置.

然后在CacheExpires.EnableExpirationTimer()...中设置将触发检查过期项目的计时器

DateTime utcNow = DateTime.UtcNow;
TimeSpan span = _tsPerBucket - new TimeSpan(utcNow.Ticks % _tsPerBucket.Ticks);
this._timer = new Timer(new TimerCallback(this.TimerCallback), null,
    span.Ticks / 0x2710L, _tsPerBucket.Ticks / 0x2710L);
Run Code Online (Sandbox Code Playgroud)

计算span确保计时器正好在:00,:20,:40秒发射,但我看不出有任何理由要打扰.计时器调用的方法是internal,所以我认为没有办法设置自己的计时器来更频繁地调用它(忽略反射).

然而,好消息是你不应该有任何理由关心间隔.Cache.Get()检查项目是否已过期,如果有,则立即从缓存中删除该项目并返回null.因此,即使过期的项目可能在缓存中保留最多20秒,您也永远不会从缓存中获取过期项目.