Asp.Net 4.0 CacheItemPolicy Gleitender Ablauf ist falsch?

8
%Vor%     
peng 03.10.2010, 04:11
quelle

3 Antworten

4

Möglicherweise ist der Grund, dass der Schlaf nicht deterministisch ist. Es hält Ihren Thread für 600 Millisekunden nicht an. Es pausiert den Thread für mindestens 600 ms. Es könnte sehr gut über die 1 Sekunde Schiebe Ablauf gehen, die Sie gesetzt haben, ohne dass Sie es merken.

    
Colin Mackay 13.11.2010 18:16
quelle
4

Dies ist nicht , wie in den anderen Antworten erwähnt, da Thread.Sleep () länger dauert als erwartet.

MemoryCache scheint mit seinem gleitenden Timer ziemlich ungenau zu sein. Ich vermute, dass dies der Fall ist, damit sie das Sperren vermeiden und die Leistung des Caches aufrechterhalten können.

  • Wenn Sie einen gleitenden Ablauf von 1 Sekunde oder weniger festlegen, werden die Cache-Elemente nach einer Sekunde entfernt, unabhängig davon, wie oft auf sie zugegriffen wird.
  • Zwischen 1 und 2 Sekunden scheint es immer noch eine Chance zu geben, die Cache-Objekte zu vertreiben. Dies kann etwas von der Last abhängen, unter der der Computer läuft, und es hängt definitiv stark davon ab, wann auf die Elemente zugegriffen wird, aber nicht so vorhersehbar, wie Sie denken. Beispielsweise:
    • Wenn ich den Ablauf auf einen Wert zwischen 1.001 Sekunden und 1.24 Sekunden einstelle und zwischen den Zugriffen für 200 oder 250 Millisekunden inaktiviere, behält es den Wert im Cache; aber wenn ich 201 oder 249 Millisekunden lang schlafe, wird der Gegenstand geräumt.
    • Wenn ich den Ablauf auf 1,25 Sekunden setze, kann ich ohne Probleme bis zu 624 Millisekunden schlafen, aber wenn ich 625 Millisekunden drücke, wird der Cache-Gegenstand entfernt.
  • Sobald Sie eine Ablauffrist von zwei Sekunden erreicht haben, scheint es korrekt zu funktionieren, auch wenn Sie nur kurz vor Ablauf der Ablauffrist auf das Element zugreifen.

Ich denke also, die Lektion besteht darin, dass man sich nicht darauf verlassen kann, dass die Ablaufzeiten für Werte unter 2 Sekunden verschoben werden. Dies kann etwas damit zu tun haben, dass PollingInterval auf 2 Sekunden gesetzt ist.

Code:

%Vor%     
StriplingWarrior 13.10.2014 22:51
quelle
0

Ich hatte das gleiche Problem. Aber eigentlich ist das Problem das, was @Colin gesagt hat. Die Thread.Sleep übernimmt mehr als eine Sekunde.

Also habe ich einen Test mit einer größeren Verzögerung gemacht

%Vor%

Und es ging vorbei. Ich bin mir nicht sicher, ob es immer funktionieren wird - wahrscheinlich nicht - aber ich habe gerade bestätigt, dass das Gleiten tatsächlich funktioniert.

    
BrunoLM 21.05.2011 03:29
quelle

Tags und Links