private bool DoAcquire(AwaitableLock.ILockRelease lockRelease) { if (Tokens > 0) { Tokens -= 1; return(true); } CalculateTokenBalanceAndMillisTillNext(lockRelease); if (Tokens > 0) { Tokens -= 1; return(true); } else { return(false); } }
private int CalculateTokenBalanceAndMillisTillNext(AwaitableLock.ILockRelease @lock) { if (@lock == null) { throw new Exception("Token balance must be updated within a lock"); } var now = TimeProvider.GetDateTime(); var millisSince = (int)now.Subtract(_lastToken).TotalMilliseconds; var periods = millisSince / TokenPeriodMillis; var newTokens = periods + Tokens > MaxTokens ? MaxTokens : periods + Tokens; Tokens = newTokens; var millisToNext = millisSince % TokenPeriodMillis; _lastToken = now.AddMilliseconds(millisToNext - TokenPeriodMillis); return(millisToNext); }