Wenn Sie mit Reflector herumstochern, wird angezeigt, dass das Intervall fest codiert ist. Ablauf wird durch eine interne CacheExpires
Klasse behandelt, deren statischen Konstruktor enthält
_tsPerBucket = new TimeSpan(0, 0, 20);
_tsPerBucket
readonly
ist, so kann es keine Konfigurationseinstellung sein, die es später modifiziert.
Der Zeitgeber, der die Prüfung für abgelaufene Elemente auslösen wird dann in CacheExpires.EnableExpirationTimer()
einstellen ...
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);
Die Berechnung der span
stellt sicher, dass der Zeitgeber ausgelöst genau auf: 00: 20: 40 Sekunden obwohl ich keinen Grund sehe, mich darum zu kümmern. Die Methode, die der Timer aufruft, ist internal
, also glaube ich nicht, dass es irgendeinen Weg gibt, einen eigenen Timer einzurichten, um ihn öfter anzurufen (Reflexion ignorierend).
Die gute Nachricht ist jedoch, dass Sie eigentlich keinen Grund haben sollten, sich um das Intervall zu kümmern. prüft, ob das Element nicht abgelaufen ist, und wenn dies der Fall ist, entfernt es das Objekt sofort aus dem Cache und gibt null
zurück. Daher erhalten Sie nie ein abgelaufenes Objekt aus dem Cache, obwohl abgelaufene Elemente bis zu 20 Sekunden im Cache bleiben können.