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);
        }