如何在果园中运行预定任务?

use*_*317 4 .net c# asp.net timer orchardcms

我必须每5个小时执行一次自动化作业。

我找到了有关如何使用IScheduledTaskHandler和IScheduledTaskManager创建计划任务的文章。 使用Orchard CMS安排的任务

我复制了相同的代码,在Process函数中添加了服务调用。它编译良好。但是我不确定是否必须“启动”此计划的任务,例如Windows服务启动。构建解决方案后,它会自动被拾取吗?如果要在5个小时内运行此作业,时钟何时开始计时?如果我想停止/暂停,该怎么办?

谢谢。

编辑:

如果尝试使用任务处理程序启用自定义模块,则会出现异常。

异常详细信息:System.ArgumentNullException:值不能为null。参数名称:来源

Line 241: var shellContext = _shellContexts.FirstOrDefault(c => c.Settings.Name == settings.Name);
Run Code Online (Sandbox Code Playgroud)

源文件:\ orchard-1.4 \ src \ Orchard \ Environment \ DefaultOrchardHost.cs行:241

_shellContexts将显示为null。如果我从项目/模块中删除任务处理程序类,则一切正常。

这是任务处理程序代码。

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


}
Run Code Online (Sandbox Code Playgroud)

Pio*_*myd 5

启动应用程序时,时钟会自动开始滴答-您无法停止/暂停。

调度程序每隔1分钟运行一次-它检查是否有现在应该运行的任务并运行它们。任务存储在数据库中-总是在即将开始执行任务之前删除相应的记录(以确保给定的任务仅运行一次)。

如果您需要执行一项周期性任务,则需要在上一个任务完成后立即创建一个新任务(例如,链接到的示例)。