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;
}
Kommentar zu dem Problem - Öffnen
Warum wollen Sie das cache-Objekt(en) für so eine kurze Zeit? Es scheint nicht viel Wert, mit einem cache, wenn die Objekte werden vertrieben in 5-15 Sekunden. Kommentarautor: nateirvin
Ich fand noch mehr seltsames Verhalten: wenn Sie RemovedCallback auf CacheItemPolicy, dass die Verspätung reduziert sich auf 10 Sekunden Kommentarautor: Oleksandr Pshenychnyy
Update zu meinem vorherigen Kommentar: nicht immer 10 Sekunden, manchmal 0, manchmal 20. Aber sehr oft genau 10 Sekunden Kommentarautor: Oleksandr Pshenychnyy

InformationsquelleAutor der Frage Jared | 2012-09-27

Schreibe einen Kommentar