Пример #1
0
        private TimeSpan UpdateInterval(PollingServiceLoad currentLoad, TimeSpan currentInterval)
        {
            switch (currentLoad)
            {
            case PollingServiceLoad.High:
                return(_minInterval);

            case PollingServiceLoad.Medium:
                return(currentInterval);

            case PollingServiceLoad.Low:
                IPollingServiceOptions options = _options.CurrentValue;
                TimeSpan interval = currentInterval + options.PollingIntervalFade;

                if (interval > options.MaxPollingInterval)
                {
                    interval = options.MaxPollingInterval;
                }

                return(interval);

            default:
                throw new ArgumentOutOfRangeException(nameof(currentLoad));
            }
        }
Пример #2
0
        private async Task ExecuteCoreAsync(CancellationToken stoppingToken)
        {
            TimeSpan interval = _minInterval;

            while (!stoppingToken.IsCancellationRequested)
            {
                try
                {
                    PollingServiceLoad serviceLoad = await PollAsync(stoppingToken);

                    interval = UpdateInterval(serviceLoad, interval);
                }
                catch (Exception e)
                {
                    Logger.PollFailed(e);
                }

                if (interval > _minInterval)
                {
                    await Task.Delay(interval, stoppingToken);
                }
            }
        }