private bool StartTask(IScheduledTask scheduledTask) { lock (_lock) { if (!IsEnabled) { return(false); } Log.Debug("Starting task {0}", scheduledTask); var runningTask = new RunningTask(scheduledTask, _timeService.CurrentDateTime); #pragma warning disable 4014 // Note: don't await, we are a scheduler. var task = TaskShim.Run(async() => await scheduledTask.InvokeAsync(), runningTask.CancellationTokenSource.Token); task.ContinueWith(OnRunningTaskCompleted); #pragma warning restore 4014 Log.Debug("Started task {0}", scheduledTask); var completed = task.IsCompleted; if (completed) { // Shortcut mode TaskStarted.SafeInvoke(this, new TaskEventArgs(runningTask)); OnRunningTaskCompleted(task); } else { _runningTasks.Add(new RunningTaskInfo(task, runningTask)); TaskStarted.SafeInvoke(this, new TaskEventArgs(runningTask)); } } // Note: it's important to start possible recurring tasks outside the loop if (scheduledTask.Recurring.HasValue) { var startDate = _timeService.CurrentDateTime.Add(scheduledTask.Recurring.Value); Log.Debug("Task {0} is a recurring task, rescheduling a copy at '{1}'", scheduledTask, startDate); var newScheduledTask = (IScheduledTask)scheduledTask.Clone(); newScheduledTask.Start = startDate; AddScheduledTask(newScheduledTask); } return(true); }