使用 Reflector 进行探索发现间隔是硬编码的。过期由内部CacheExpires 类处理,其静态构造函数包含
_tsPerBucket = new TimeSpan(0, 0, 20);
_tsPerBucket 是readonly,所以以后不能有任何配置设置修改它。
然后在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);
span 的计算确保计时器准确地在 :00、:20、:40 秒触发,但我看不出有任何打扰的理由。定时器调用的方法是internal,所以我认为没有办法设置自己的定时器来更频繁地调用它(忽略反射)。
不过,好消息是您不应该真的有任何理由关心间隔。 Cache.Get() 检查项目是否过期,如果过期则立即从缓存中删除项目并返回 null。因此,您永远不会从缓存中获取过期项目,即使过期项目可能会在缓存中停留长达 20 秒。