使用Quartz .NET计划Windows服务

3
我有一个自定义的Windows服务,我想使用Quartz .NET来安排服务运行时间。现在,我了解了quartz.NET的基础知识,但我不确定如何将其连接到Windows服务。假设我想每小时运行Service.exe,我该如何通过Quartz实现这个功能呢?虽然这是一个比较模糊的问题,但确实没有其他更好的问法。
提前感谢您的帮助。

在这种情况下,我会使用Windows计划程序,因为该功能已经封装在服务中了。 - Jason Meckley
这也是我第一个想法。但不幸的是,我并不能在这里做决定 :P - Phillip Schmidt
1个回答

6
您需要设置一个任务和触发器。触发器调用任务。(http://quartznet.sourceforge.net/tutorial/lesson_3.html)。以下是每小时运行的示例。
// construct a scheduler factory
ISchedulerFactory schedFact = new StdSchedulerFactory();

// get a scheduler
IScheduler sched = schedFact.GetScheduler();
sched.Start();

// construct job info
JobDetail jobDetail = new JobDetail("myJob", null, typeof(DumbJob));
// fire every hour
Trigger trigger = TriggerUtils.MakeHourlyTrigger();
// start on the next even hour
trigger.StartTime = TriggerUtils.GetEvenHourDate(DateTime.UtcNow);  
trigger.Name = "myTrigger";
sched.ScheduleJob(jobDetail, trigger);

这是调用Service.exe的类。
public class DumbJob : IJob
{
    public void Execute(JobExecutionContext context)
    {
        string instName = context.JobDetail.Name;
        string instGroup = context.JobDetail.Group;

        // Note the difference from the previous example
        JobDataMap dataMap = context.MergedJobDataMap;

        string jobSays = dataMap.GetString("jobSays");
        float myFloatValue = dataMap.GetFloat("myFloatValue");
        ArrayList state = (ArrayList) dataMap.Get("myStateData");
        state.Add(DateTime.UtcNow);

        Console.WriteLine("Instance {0} of DumbJob says: {1}", instName, jobSays);
    }
}

你也可以在Windows服务中启动一个线程,跟踪上次运行exe的时间,并在重置后重新启动。这比Quartz简单一些,但可以实现相同的功能。但是,你的问题是与Quartz相关的。


1
但它实际上连接到Service.exe的哪里? - Phillip Schmidt
你在“Execute(...)”方法中调用它。 - Steve Sloka
1
你可以使用:Process.Start("Service.exe"); 还有更多选项可供使用,例如传递一个 ProcessStartInfo 对象,但基本上这样就可以了。 - Steve Sloka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接