public void RegisterSchedule(string name, TimeSpan interval, Action action) { if (name == null) throw new ArgumentNullException(nameof(name)); if (action == null) throw new ArgumentNullException(nameof(action)); lock (_syncRoot) { if (_schedules.Any(s => s.Name.Equals(name))) { throw new InvalidOperationException($"Schedule with name '{name}' is already registered."); } var schedule = new Schedule(name, interval, action) { NextExecution = _dateTimeService.Now }; _schedules.Add(schedule); Log.Info($"Registerd schedule '{name}' with interval of {interval}."); } }
private void ExecuteSchedule(Schedule schedule) { var stopwatch = Stopwatch.StartNew(); try { Log.Verbose($"Executing schedule '{schedule.Name}'."); schedule.Action(); schedule.LastErrorMessage = null; schedule.Status = ScheduleStatus.Idle; } catch (Exception exception) { Log.Error(exception, $"Error while executing schedule '{schedule.Name}'."); schedule.Status = ScheduleStatus.Faulted; schedule.LastErrorMessage = exception.Message; } finally { schedule.LastExecutionDuration = stopwatch.Elapsed; schedule.LastExecution = _dateTimeService.Now; schedule.NextExecution = _dateTimeService.Now + schedule.Interval; } }