C# Windows服务中的Quartz作业调度器

C# Windows服务中的Quartz作业调度器,c#,.net,windows-services,scheduler,quartz.net,C#,.net,Windows Services,Scheduler,Quartz.net,我有一个windows服务项目,它的OnStart方法如下 protect void OnStart(string[] args) { IScheduler someScheduler = _schedFactory.GetScheduler(); // _schedFactory is a priva field of the service class IJobDetail someJob = JobBuilder.Create<SomeJob>()

我有一个windows服务项目,它的
OnStart
方法如下

protect void OnStart(string[] args)
{
    IScheduler someScheduler = _schedFactory.GetScheduler(); // _schedFactory is a priva field of the service class

    IJobDetail someJob = JobBuilder.Create<SomeJob>()
        .WithIdentity("SomeJob")
        .Build();

    ITrigger someTrigger = TriggerBuilder.Create()
        .StartAt(new DateTimeOffset(DateTime.UtcNow.AddSeconds(30)))
        .WithSimpleSchedule(schedule => scheduler.WithIntervalInMinutes(3).RepeatForever())
        .Build();

    someScheduler.SchedulerJob(someJob, someTrigger);

    someScheduler.Start();
}
protect void OnStart(字符串[]args)
{
IsScheduler someScheduler=\u schedFactory.GetScheduler();/\u schedFactory是服务类的priva字段
IJobDetail someJob=JobBuilder.Create()
.WithIdentity(“SomeJob”)
.Build();
ITrigger someTrigger=TriggerBuilder.Create()
.StartAt(新的DateTimeOffset(DateTime.UtcNow.AddSeconds(30)))
.WithSimpleSchedule(schedule=>scheduler.WithIntervalInMinutes(3).RepeatForever())
.Build();
SchedulerJob(someJob,someTrigger);
someScheduler.Start();
}

我使用VisualStudioDeveloper命令提示符安装该服务。命令是
installutil.exe
。现在,当安装该服务时,我转到任务管理器并启动它。在
OnStart
方法的顶部有
Thread.Sleep(10000)
,因此我可以通过调试器连接到服务。所以当它被附加时,我通过代码,没有什么特别的事情发生,我的意思是没有异常发生。我甚至看到了作业应该执行的时间及其正确性。当我坐在调试模式中等待作业的
Execute
方法被执行时,它并没有被执行。我的意思是,当VisualStudio加载符号时,作业本身不会执行。有什么问题吗?还有一件事,我正在这个
OnStart
方法中创建两个作业。代码是一样的。这可能是问题的原因吗?第二项工作有时会执行,有时不会。我的意思是,如果它执行一次,它将每3分钟执行一次,但如果它没有在第一个计划时间执行,它将永远不会执行。

代码的问题是,在OnStart完成运行后,对调度程序的引用不在范围内。SomeScheduler应该在函数之外的某个地方定义,这样它就不会被垃圾收集。例如,Quartz.Net服务器项目就是这样做的(使用Topshelf,但我想你明白了。这是安装服务的主程序。请注意,它会返回对服务器的引用,以便主机可以保留对它的引用

public static class Program
{
    /// <summary>
    /// Main.
    /// </summary>
    public static void Main()
    {
        HostFactory.Run(x =>
                            {
                                x.RunAsLocalSystem();

                                x.SetDescription(Configuration.ServiceDescription);
                                x.SetDisplayName(Configuration.ServiceDisplayName);
                                x.SetServiceName(Configuration.ServiceName);

                                x.Service(factory =>
                                              {
                                                  QuartzServer server = new QuartzServer();
                                                  server.Initialize();
                                                  return server;
                                              });
                            });
    }
}
正如@granadaCoder所指出的,简单地重用所提供的服务器可能更容易

以下是和的链接

public class QuartzServer : ServiceControl, IQuartzServer
{
    private readonly ILog logger;
    private ISchedulerFactory schedulerFactory;
    private IScheduler scheduler; // code snipped....

}