Пример #1
0
        private int GetNextCallTime()
        {
            var nextCallTime = 0;

            if (RateLimits.Any())
            {
                lock (_lock)
                {
                    nextCallTime = RateLimits
                                   .Max(l => l.GetNextAllowedCallTime(CallTracker));

                    CallTracker.CallWillHappenIn(nextCallTime);
                    CallTracker.TrimCallsForRateLimits(RateLimits);
                }
            }

            return(nextCallTime);
        }
        internal override int GetNextAllowedCallTime(CallTracker callTracker)
        {
            var callHistory = callTracker.CallHistory
                              .OrderByDescending(x => x)
                              .Take(Amount)
                              .ToList();

            if (!callHistory.Any() || callHistory.Count < Amount)
            {
                return(0);
            }

            var earliestCallTime = callHistory.OrderBy(x => x).First();
            var nextCallTime     = earliestCallTime.Add(TimeSpan.FromMilliseconds(TimeFrame.TotalMilliseconds));
            var untilNextCall    = nextCallTime.Subtract(ReferenceTime.UtcNow);

            var milliseconds = untilNextCall.TotalMilliseconds < 0 ? 0 : untilNextCall.TotalMilliseconds;

            return((int)Math.Ceiling(milliseconds));
        }
 /// <summary>
 /// Gets the next allowed call time in milliseconds
 /// </summary>
 /// <returns></returns>
 internal abstract int GetNextAllowedCallTime(CallTracker callTracker);
Пример #4
0
        public RateLimiter(params RateLimit[] rateLimits)
        {
            RateLimits = rateLimits.ToList();

            CallTracker = new CallTracker();
        }