Jak prowadzić zaplanowane zadania w Orchard?

Muszę wykonywać zautomatyzowaną pracę co 5 godzin.

Znalazłem ten post na temat tworzenia zaplanowanych zadań, używając IScheduledTaskHandler i IScheduledTaskManager.Zaplanowane zadania przy użyciu Orchard CMS

Skopiowałem ten sam kod, dodałem wywołanie usługi wewnątrz funkcji Process. Kompiluje się dobrze. Ale nie jestem pewien, czy muszę „uruchomić” to zaplanowane zadanie, jak uruchomienie usługi Windows. Czy jest pobierany automatycznie po zbudowaniu rozwiązania? Kiedy zegar zacznie tykać, jeśli chcę uruchomić tę pracę w ciągu 5 godzin? A jeśli chcę zatrzymać / wstrzymać, jak mogę to zrobić?

Dzięki.

EDYTOWAĆ:

Otrzymuję wyjątek, jeśli próbuję włączyć moduł niestandardowy za pomocą procedury obsługi zadań.

Szczegóły wyjątku: System.ArgumentNullException: Wartość nie może być pusta. Nazwa parametru: źródło

Line 241: var shellContext = _shellContexts.FirstOrDefault(c => c.Settings.Name == settings.Name);

Plik źródłowy: sad-1.4 src Sad Środowisko DefaultOrchardHost.cs Line: 241

_ShellContexts ma wartość null. Jeśli usunę klasę obsługi zadań z projektu / modułu, wszystko działa prawidłowo.

Oto kod programu obsługi zadań.

public class ScheduledTaskHandler : IScheduledTaskHandler
{
    private const string TaskType = "MyTaskUniqueID";
    private readonly IScheduledTaskManager _taskManager;
    private readonly IMyService _myService;

    public ILogger Logger { get; set; }

    public ScheduledTaskHandler(IScheduledTaskManager taskManager, IMyService myService)
    {
        _myService = myService;
        _taskManager = taskManager;
        Logger = NullLogger.Instance;
        try
        {
            DateTime firstDate = new DateTime().AddMinutes(5);
            ScheduleNextTask(firstDate);
        }
        catch (Exception e)
        {
            this.Logger.Error(e, e.Message);
        }
    }

    public void Process(ScheduledTaskContext context)
    {
        if (context.Task.TaskType == TaskType)
        {
            try
            {
                _myService.RunJob();
            }
            catch (Exception e)
            {
                this.Logger.Error(e, e.Message);
            }
            finally
            {
                DateTime nextTaskDate = new DateTime().AddHours(5);
                ScheduleNextTask(nextTaskDate);
            }
        }
    }

    private void ScheduleNextTask(DateTime date)
    {
        if (date > DateTime.UtcNow)
        {
            var tasks = this._taskManager.GetTasks(TaskType);
            if (tasks == null || tasks.Count() == 0)
                this._taskManager.CreateTask(TaskType, date, null);
        }
    }


}

questionAnswers(3)

yourAnswerToTheQuestion