public void Leak()
{
lock (leakLock)
{
var current = currentSize;
if (current == 0)
{
lastLeakOn = DateTime.UtcNow;
return;
}
else
{
var elapsed = (DateTime.UtcNow - lastLeakOn).TotalMilliseconds;
var leak = (elapsed / 1000) * LeakRate;
if (leak >= 1)
{
while (Interlocked.CompareExchange(ref currentSize, Math.Max(0, current - (int)leak), current) != current)
{
current = currentSize;
elapsed = (DateTime.UtcNow - lastLeakOn).TotalMilliseconds;
leak = (elapsed / 1000) * LeakRate;
}
lastLeakOn = DateTime.UtcNow;
}
}
}
}