/// <summary> /// Adds a scheduled task to this instance of Schtick. /// </summary> /// <param name="name">A unique name for this task. If null, a guid will be used.</param> /// <param name="schedule">A Schyntax Schedule object.</param> /// <param name="callback">Function which will be called each time the task is supposed to run.</param> /// <param name="autoRun">If true, Start() will be called on the task automatically.</param> /// <param name="lastKnownEvent">The last Date when the task is known to have run. Used for Task Windows.</param> /// <param name="window"> /// The period of time after an event should have run where it would still be appropriate to run it. /// See Task Windows documentation for more details. /// </param> public ScheduledTask AddTask( string name, Schedule schedule, ScheduledTaskCallback callback, bool autoRun = true, DateTimeOffset lastKnownEvent = default(DateTimeOffset), TimeSpan window = default(TimeSpan)) { if (callback == null) throw new ArgumentNullException(nameof(callback)); return AddTaskImpl(name, schedule, callback, null, autoRun, lastKnownEvent, window); }
internal ScheduledTask(Schtick schtick, string name, Schedule schedule, ScheduledTaskCallback callback, ScheduledTaskAsyncCallback asyncCallback) { _schtick = schtick; Name = name; Schedule = schedule; if ((callback == null) == (asyncCallback == null)) throw new Exception("callback or asyncCallback must be specified, but not both."); Callback = callback; AsyncCallback = asyncCallback; }
public void UpdateSchedule(Schedule schedule) { if (schedule == null) throw new ArgumentNullException(nameof(schedule)); lock (_scheduleLock) { var wasRunning = IsScheduleRunning; if (wasRunning) StopSchedule(); Schedule = schedule; if (wasRunning) StartSchedule(); } }
private ScheduledTask AddTaskImpl( string name, Schedule schedule, ScheduledTaskCallback callback, ScheduledTaskAsyncCallback asyncCallback, bool autoRun, DateTimeOffset lastKnownEvent, TimeSpan window) { if (schedule == null) throw new ArgumentNullException(nameof(schedule)); if (name == null) name = Guid.NewGuid().ToString(); ScheduledTask task; lock (_lockTasks) { if (IsShuttingDown) throw new Exception("Cannot add a task to Schtick after Shutdown() has been called."); if (_tasks.ContainsKey(name)) throw new Exception($"A scheduled task named \"{name}\" already exists."); task = new ScheduledTask(this, name, schedule, callback, asyncCallback) { Window = window, IsAttached = true, }; _tasks.Add(name, task); } task.OnException += TaskOnOnException; if (autoRun) task.StartSchedule(lastKnownEvent); return task; }