/// <summary> /// Timer Event Starting All Due Tasks /// </summary> /// <param name="source"></param> /// <param name="e"></param> private void OnTick(object source, ElapsedEventArgs e) { System.Threading.Interlocked.Exchange(ref NextDueTick, long.MaxValue); var nextDueTime = long.MaxValue; lock (SchedulerLock) { ResolveRunningTimers(); ResolvePendingTimers(); ConsumePendingScheduledTasks(); // Schedule Next Tick var nextTask = ScheduledTimers.FirstOrDefault(); if (nextTask.Value != null) { nextDueTime = nextTask.Key; } } SignalNextDueTick(nextDueTime); }