MemoryCache AbsoluteExpiration wirkt seltsam
Ich versuche, einen MemoryCache
.net 4.5 zu verfolgen und automatisch zu aktualisieren, die verschiedenen Elemente, aber es scheint so, egal was ich eingestellt habe, als AbsoluteExpiration
es wird immer nur läuft in 15 Sekunden oder mehr.
Ich soll den cache-items zu verfallen alle 5 Sekunden, aber immer abläuft, der in mindestens 15 Sekunden, und wenn ich verschieben den Ablauf der Zeit aus, es wird am Ende so etwas wie 15 Sekunden + meine refresh-Intervall, aber nie weniger als 15 Sekunden.
Gibt es einige interne timer-Auflösung, die ich nicht sehe? Ich schaute durch ein bit des reflektierten System.Runtime.Caching.MemoryCache
code und nichts Stand heraus zu mir, und ich habe nicht in der Lage zu finden, wer sonst hat dieses Problem auf das internet.
Ich habe eine sehr einfache Beispiel unten zeigt das problem.
Was ich will, ist für CacheEntryUpdate
getroffen werden, alle 5 Sekunden oder so und mit neuen Daten aktualisieren, aber, wie ich gesagt habe, es immer nur bekommt Treffer in 15+ Sekunden.
static MemoryCache MemCache;
static int RefreshInterval = 5000;
protected void Page_Load(object sender, EventArgs e)
{
if (MemCache == null)
MemCache = new MemoryCache("MemCache");
if (!MemCache.Contains("cacheItem"))
{
var cacheObj = new object();
var policy = new CacheItemPolicy
{
UpdateCallback = new CacheEntryUpdateCallback(CacheEntryUpdate),
AbsoluteExpiration = DateTimeOffset.UtcNow.AddMilliseconds(RefreshInterval)
};
var cacheItem = new CacheItem("cacheItem", cacheObj);
MemCache.Set("cacheItem", cacheItem, policy);
}
}
private void CacheEntryUpdate(CacheEntryUpdateArguments args)
{
var cacheItem = MemCache.GetCacheItem(args.Key);
var cacheObj = cacheItem.Value;
cacheItem.Value = cacheObj;
args.UpdatedCacheItem = cacheItem;
var policy = new CacheItemPolicy
{
UpdateCallback = new CacheEntryUpdateCallback(CacheEntryUpdate),
AbsoluteExpiration = DateTimeOffset.UtcNow.AddMilliseconds(RefreshInterval)
};
args.UpdatedCacheItemPolicy = policy;
}
InformationsquelleAutor der Frage Jared | 2012-09-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich es herausgefunden. Es gibt eine
internal static readonly TimeSpan
- System.- Laufzeit.- Caching.CacheExpires genannt _tsPerBucket, die ist fest auf 20 Sekunden.Offenbar, dieses Feld ist, was verwendet werden auf dem internen Timer, ausführen und überprüfen, um zu sehen, ob cache-items abgelaufen sind.
Bin ich arbeiten, um dieses durch überschreiben den Wert mit der spiegelung und clearing die Standard-MemoryCache Instanz zurücksetzen alles. Es scheint zu funktionieren, auch wenn es ein Riesen hack.
Hier ist der aktualisierte code:
InformationsquelleAutor der Antwort Jared
Zu MatteoSp - pollingInterval in der Konfiguration oder der NameValueCollection im Konstruktor einen anderen timer. Es ist ein Intervall, die, wenn Sie aufgerufen wird, verwenden die beiden anderen config-Eigenschaften, um zu bestimmen, wenn der Speicher auf einem Niveau, das erfordert, dass die Einträge entfernt werden, mithilfe der Trim-Methode.
InformationsquelleAutor der Antwort user487779
Wären Sie bereit/in der Lage zu ändern, die älteren System.- Laufzeit.Caching der neuen Microsft.Extensions.Caching? version 1.x unterstützt netstandard 1.3 und net451. Wenn ja, dann ist der verbesserte API-Unterstützung bei der Nutzung, die Sie beschreiben, ohne Hack mit Reflexion.
Den MemoryCacheOptions-Objekt hat eine Eigenschaft ExpirationScanFrequency, können Sie die scan-Frequenz des cache-Bereinigung, siehe https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.caching.memory.memorycacheoptions.expirationscanfrequency?view=aspnetcore-2.0
Bewusst sein, dass es nicht mehr den Ablauf basierend auf der Timer (das ist eine Leistung die design-Entscheidung), und so nun der Arbeitsspeicher oder der Aufruf einer Get () - basierte Methoden für die zwischengespeicherten Objekte sind nun die Auslöser für den Ablauf. Sie können jedoch erzwingen, Zeit-basierte Ablauf mit Rücktritt-Token finden Sie unter dieser Antwort SO ein Beispiel für https://stackoverflow.com/a/47949111/3140853.
InformationsquelleAutor der Antwort alastairtree
Eine aktualisierte version basierend auf @Jared ' s Antwort. Insread von "Standard" ändern MemoryCache Instanz, die hier eine neue erstellt.
InformationsquelleAutor der Antwort Mr.Wang from Next Door