private void ExecuteAndReschedule(ISchedulerTask task) { task.Execute(); tasks[task].Dispose(); int seed = (int)(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() & (long)int.MaxValue); Random rnd = new Random(seed); long randomInterval = Convert.ToInt32(task.Interval.TotalMilliseconds) + (rnd.Next( Convert.ToInt32(-(task.RangeSize.TotalMilliseconds / 2)), Convert.ToInt32(task.RangeSize.TotalMilliseconds / 2))); if (randomInterval < 0) { randomInterval = 0; } log.Debug($"[{task}] Scheduling next task in {randomInterval} ms"); var timer = new Timer((e) => ExecuteAndReschedule(task), null, randomInterval, Timeout.Infinite); tasks[task] = timer; }