コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }