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)); } }
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); } } }