1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
// This file implements the classes ExpiresEntryRef and CacheExpires missing from .NET reference source
using System.Threading;
namespace System.Runtime.Caching
{
class ExpiresEntryRef
{
public static ExpiresEntryRef INVALID = new ExpiresEntryRef ();
public bool IsInvalid {
get { return this == INVALID; }
}
}
class CacheExpiresHelper : ICacheEntryHelper
{
public int Compare(MemoryCacheEntry entry1, MemoryCacheEntry entry2)
{
return DateTime.Compare (entry1.UtcAbsExp , entry2.UtcAbsExp);
}
public DateTime GetDateTime (MemoryCacheEntry entry)
{
return entry.UtcAbsExp;
}
}
class CacheExpires : CacheEntryCollection
{
public static TimeSpan MIN_UPDATE_DELTA = new TimeSpan (0, 0, 1);
public static TimeSpan EXPIRATIONS_INTERVAL = new TimeSpan (0, 0, 20);
public static CacheExpiresHelper helper = new CacheExpiresHelper ();
Timer timer;
public CacheExpires (MemoryCacheStore store)
: base (store, helper)
{
}
public new void Add (MemoryCacheEntry entry)
{
entry.ExpiresEntryRef = new ExpiresEntryRef ();
base.Add (entry);
}
public new void Remove (MemoryCacheEntry entry)
{
base.Remove (entry);
entry.ExpiresEntryRef = ExpiresEntryRef.INVALID;
}
public void UtcUpdate (MemoryCacheEntry entry, DateTime utcAbsExp)
{
base.Remove (entry);
entry.UtcAbsExp = utcAbsExp;
base.Add (entry);
}
public void EnableExpirationTimer (bool enable)
{
if (enable) {
if (timer != null)
return;
var period = (int) EXPIRATIONS_INTERVAL.TotalMilliseconds;
timer = new Timer ((o) => FlushExpiredItems (true), null, period, period);
} else {
timer.Dispose ();
timer = null;
}
}
public int FlushExpiredItems (bool blockInsert)
{
return base.FlushItems (DateTime.UtcNow, CacheEntryRemovedReason.Expired, blockInsert);
}
}
}
|