Как запустить запланированные задачи в саду?
Я должен запускать автоматизированную работу каждые 5 часов.
Я нашел этот пост о том, как создавать запланированные задачи, используя IScheduledTaskHandler и IScheduledTaskManager. Запланированные задачи с использованием Orchard CMS
Я скопировал тот же код, я добавил свой сервисный вызов внутри функции Process. Компилируется нормально. Но я не уверен, что мне нужно «начинать»; это запланированное задание, как запуск службы Windows. Получается ли он автоматически после того, как я соберу решение? Когда часы начинают тикать, если я хочу запустить эту работу через 5 часов? И если я хочу остановиться / сделать паузу, как я могу это сделать?
Благодарю.
РЕДАКТИРОВАТЬ:
Я получаю исключение, если я пытаюсь включить пользовательский модуль с обработчиком задач.
Сведения об исключении: System.ArgumentNullException: значение не может быть нулевым. Имя параметра: источник
Line 241: var shellContext = _shellContexts.FirstOrDefault(c => c.Settings.Name == settings.Name);
Исходный файл: \ orchard-1.4 \ src \ Orchard \ Environment \ DefaultOrchardHost.cs Строка: 241
_ShellContexts становится пустым. Если я удаляю класс обработчика задач из проекта / модуля, все работает нормально.
Вот код обработчика задачи.
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);
}
}
}