Skip to content

Instantly share code, notes, and snippets.

@yemrekeskin
Created September 20, 2013 07:18
Show Gist options
  • Save yemrekeskin/6634275 to your computer and use it in GitHub Desktop.
Save yemrekeskin/6634275 to your computer and use it in GitHub Desktop.
// Contract
public interface IScheduledTaskManager
{
void AddAbsoluteTask(Action task, int absoluteMinute);
void AddAbsoluteTask(Action task, int absoluteHour, int absoluteMinute);
void AddSlidingTask(Action task, int slidingMinute);
void AddSlidingTask(Action task, int slidingHour, int slidingMinute);
}
// Main Class
public class ScheduledTaskManager
: IScheduledTaskManager , IDisposable
{
List<Task> Tasks = new List<Task>();
private Timer Timer;
private Func<DateTime> Watch;
public ScheduledTaskManager(Func<DateTime> currentTimeWatch = null)
{
Watch = currentTimeWatch ?? new Func<DateTime>(Helper.GetCurrentDatetime);
Timer = new System.Timers.Timer(1000);
Timer.Elapsed += Timer_Elapsed;
Timer.Start();
}
void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
foreach (var t in Tasks)
if (t.IsTime())
t.Action.Invoke();
}
public void Dispose()
{
Timer.Stop();
Timer.Dispose();
}
/// Run at every hour at given minute
public void AddAbsoluteTask(Action task, int absoluteMinute)
{
Tasks.Add(new Task { Action = task, AbsoluteMinute = absoluteMinute });
}
/// Run every day at given hour and minute
public void AddAbsoluteTask(Action task, int absoluteHour, int absoluteMinute)
{
Tasks.Add(new Task { Action = task, AbsoluteMinute = absoluteMinute, AbsoluteHour = absoluteHour });
}
/// Run after given minutes from last execution
public void AddSlidingTask(Action task, int slidingMinute)
{
Tasks.Add(new Task { Action = task, SlidingMinute = slidingMinute });
}
/// Run after given hours + minutes from last execution
public void AddSlidingTask(Action task, int slidingHour, int slidingMinute)
{
Tasks.Add(new Task { Action = task, SlidingMinute = slidingMinute, SlidingHour = slidingHour });
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment