¿Cómo ejecutar tareas programadas en Orchard?

Tengo que ejecutar un trabajo automatizado cada 5 horas.

Encontré esta publicación sobre cómo crear tareas programadas, usando IScheduledTaskHandler y IScheduledTaskManager.Tareas programadas utilizando Orchard CMS

Copié el mismo código, agregué mi llamada de servicio dentro de la función Proceso. Se compila bien. Pero no estoy seguro de si tengo que "iniciar" esta tarea programada, como el inicio de un servicio de Windows. ¿Se recoge automáticamente después de que construyo la solución? ¿Cuándo comienza a funcionar el reloj si quiero ejecutar este trabajo en 5 horas? Y si quiero detener / pausar, ¿cómo puedo hacer eso?

Gracias.

EDITAR:

Obtengo una excepción si intento habilitar el módulo personalizado con el controlador de tareas.

Detalles de la excepción: System.ArgumentNullException: el valor no puede ser nulo. Nombre del parámetro: fuente

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

Archivo de origen: \ orchard-1.4 \ src \ Orchard \ Environment \ DefaultOrchardHost.cs Línea: 241

El _shellContexts aparece como nulo. Si elimino la clase de controlador de tareas del proyecto / módulo, todo funciona bien.

Aquí está el código del controlador de tareas.

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


}

Respuestas a la pregunta(3)

Su respuesta a la pregunta