// MUST be called with cache lock held
void EnqueueTimedItem(CacheItem item)
{
long remaining = Math.Max(0, (long)(item.AbsoluteExpiration - DateTime.Now).TotalMilliseconds);
item.ExpiresAt = item.AbsoluteExpiration.Ticks;
if (timedItems == null)
{
timedItems = new CacheItemPriorityQueue();
}
if (remaining > 4294967294)
{
// Maximum due time for timer
// Item will expire properly anyway, as the timer will be
// rescheduled for the item's expiration time once that item is
// bubbled to the top of the priority queue.
expirationTimerPeriod = 4294967294;
}
else
{
expirationTimerPeriod = remaining;
}
if (expirationTimer == null)
{
expirationTimer = new Timer(new TimerCallback(ExpireItems), null, expirationTimerPeriod, expirationTimerPeriod);
}
else
{
expirationTimer.Change(expirationTimerPeriod, expirationTimerPeriod);
}
timedItems.Enqueue(item);
}