void ExpireItems(object data)
{
DateTime now = DateTime.Now;
CacheItem item = null;
expirationTimer.Change(Timeout.Infinite, Timeout.Infinite);
try
{
cacheLock.EnterWriteLock();
while (true)
{
item = timedItems.Peek();
if (item == null)
{
if (timedItems.Count == 0)
{
break;
}
timedItems.Dequeue();
continue;
}
if (!item.Disabled && item.ExpiresAt > now.Ticks)
{
break;
}
if (item.Disabled)
{
item = timedItems.Dequeue();
continue;
}
item = timedItems.Dequeue();
if (item != null)
{
if (!NeedsUpdate(item, CacheItemUpdateReason.Expired, false))
{
Remove(item.Key, CacheItemRemovedReason.Expired, false, true);
}
}
}
}
finally
{
// See comment at the top of the file, above cacheLock declaration
cacheLock.ExitWriteLock();
}
if (item != null)
{
long remaining = Math.Max(0, (long)(item.AbsoluteExpiration - now).TotalMilliseconds);
if (remaining > 0 && expirationTimerPeriod > remaining)
{
expirationTimerPeriod = remaining;
}
expirationTimer.Change(expirationTimerPeriod, expirationTimerPeriod);
return;
}
expirationTimer.Change(Timeout.Infinite, Timeout.Infinite);
expirationTimerPeriod = 0;
}