C# 使用Topshelf执行多个Quartz.NET作业

C# 使用Topshelf执行多个Quartz.NET作业,c#,quartz-scheduler,quartz.net,topshelf,C#,Quartz Scheduler,Quartz.net,Topshelf,我正在尝试使用C#运行Quartz.NET和Topshelf的多个作业 HostFactory.Run(c=> { c、 ScheduleQuartzJobaService(q=> q、 WithJob(()=>JobBuilder.Create().Build()) .AddTrigger(()=>TriggerBuilder.Create().WithSimpleSchedule(builder=>builder.WithIntervalInSeconds(ConfigurationSett

我正在尝试使用C#运行Quartz.NET和Topshelf的多个作业

HostFactory.Run(c=>
{
c、 ScheduleQuartzJobaService(q=>
q、 WithJob(()=>JobBuilder.Create().Build())
.AddTrigger(()=>TriggerBuilder.Create().WithSimpleSchedule(builder=>builder.WithIntervalInSeconds(ConfigurationSettings.AppFrequencyInSeconds).RepeatForever()).Build())
).StartAutomatically()。
ScheduleQuartzJobaService(r=>
r、 WithJob(()=>JobBuilder.Create().Build())
.AddTrigger(()=>TriggerBuilder.Create().WithSimpleSchedule(builder=>builder。
使用IntervalinSeconds(ConfigurationSettings.AppFrequencyInSeconds.RepeatForever()).Build())
).StartAutomatically();
c、 StartAutomatically();
c、 SetServiceName(“ServiceName”);
});
使用上述代码,只有TypeB中的execute方法被执行。我也尝试过:

HostFactory.Run(c =>
{
    c.ScheduleQuartzJobAsService(q =>
        q.WithJob(() => JobBuilder.Create<TypeA>().Build())
        .AddTrigger(() => TriggerBuilder.Create().WithSimpleSchedule(builder => builder.
            WithIntervalInSeconds(ConfigurationSettings.AppFrequencyInSeconds).RepeatForever()).Build())
        ).StartAutomatically();
    c.StartAutomatically();
    c.SetServiceName("Service1");

    c.ScheduleQuartzJobAsService(r =>
        r.WithJob(() => JobBuilder.Create<TypeB>().Build())
        .AddTrigger(() => TriggerBuilder.Create().WithSimpleSchedule(builder => builder.
            WithIntervalInSeconds(ConfigurationSettings.AppFrequencyInSeconds).RepeatForever()).Build())
        ).StartAutomatically();
    c.StartAutomatically();
    c.SetServiceName("Service2");
});
HostFactory.Run(c=>
{
c、 ScheduleQuartzJobaService(q=>
q、 WithJob(()=>JobBuilder.Create().Build())
.AddTrigger(()=>TriggerBuilder.Create().WithSimpleSchedule(builder=>builder。
使用IntervalinSeconds(ConfigurationSettings.AppFrequencyInSeconds.RepeatForever()).Build())
).StartAutomatically();
c、 StartAutomatically();
c、 设置服务名称(“服务1”);
c、 ScheduleQuartzJobaService(r=>
r、 WithJob(()=>JobBuilder.Create().Build())
.AddTrigger(()=>TriggerBuilder.Create().WithSimpleSchedule(builder=>builder。
使用IntervalinSeconds(ConfigurationSettings.AppFrequencyInSeconds.RepeatForever()).Build())
).StartAutomatically();
c、 StartAutomatically();
c、 SetServiceName(“服务2”);
});
使用此代码,只调用TypeB中的execute方法。我的类TypeA和TypeB都有“Execute”方法,它们是每个类的入口点(如果它们本身是作业的一部分,则会调用它们)。看起来,无论第二个服务代码是什么,都是始终被调用的服务代码——如果我交换这两个ScheduleQuartzJobaService调用的顺序,那么执行的总是第二个调用中的类

如何编写HostFactory.Run方法以使两个作业同时执行

HostFactory.Run(c =>
                {
                    c.Service<ContainerService>(s =>
                    {
                        s.ConstructUsing(name => new ContainerService());
                        s.WhenStarted((service, control) => service.Start());
                        s.WhenStopped((service, control) => service.Stop());

                        s.ScheduleQuartzJob<ContainerService>(q =>
                            q.WithJob(() =>
                                JobBuilder.Create<TypeA>().Build())
                            .AddTrigger(() =>
                                TriggerBuilder.Create()
                                    .WithSimpleSchedule(builder => builder
                                        .WithIntervalInSeconds(20)
                                        .RepeatForever())
                                    .Build())
                            );

                        s.ScheduleQuartzJob<ContainerService>(q =>
                            q.WithJob(() =>
                                JobBuilder.Create<TypeB>().Build())
                            .AddTrigger(() =>
                                TriggerBuilder.Create()
                                    .WithSimpleSchedule(builder => builder
                                        .WithIntervalInSeconds(60)
                                        .RepeatForever())
                                    .Build())
                            );
                    });

                });

我的问题是我混淆了服务和职业课程的概念。当我使用返回true的
Start()
Stop()
bool方法引入我的
ContainerService
时,我调用了
ScheduleQuartzJob
而不是
schedulequartzjobaservice
上述代码作为我的
TypeA
TypeB
已经实现了
IJob

我发现第二种方法永远也不会起作用,就像我所说的那样。因此,我想我需要知道的是如何在一个服务中运行多个作业。能否更新此内容以显示您的
容器服务
?谢谢。我现在明白了。如果你把你的应用程序作为一项服务安装在windows中,这难道不意味着停止服务的调用实际上并没有停止它吗?实际上我有几个问题。如果有人能回答这些问题,非常感谢!1.如果服务关闭或崩溃,是否会取消工作?2.我计划在一个服务中实现许多作业,重新设计任何内容是一个好主意,还是使用
ScheduleQuartzJob
将所有作业定义放在彼此的下面?
HostFactory.Run(c =>
                {
                    c.Service<ContainerService>(s =>
                    {
                        s.ConstructUsing(name => new ContainerService());
                        s.WhenStarted((service, control) => service.Start());
                        s.WhenStopped((service, control) => service.Stop());

                        s.ScheduleQuartzJob<ContainerService>(q =>
                            q.WithJob(() =>
                                JobBuilder.Create<TypeA>().Build())
                            .AddTrigger(() =>
                                TriggerBuilder.Create()
                                    .WithSimpleSchedule(builder => builder
                                        .WithIntervalInSeconds(20)
                                        .RepeatForever())
                                    .Build())
                            );

                        s.ScheduleQuartzJob<ContainerService>(q =>
                            q.WithJob(() =>
                                JobBuilder.Create<TypeB>().Build())
                            .AddTrigger(() =>
                                TriggerBuilder.Create()
                                    .WithSimpleSchedule(builder => builder
                                        .WithIntervalInSeconds(60)
                                        .RepeatForever())
                                    .Build())
                            );
                    });

                });
public class ContainerService
{
    public bool Start()
    {
        return true;
    }

    public bool Stop()
    {
        return true;
    }
}