Quartz 3.0及以上版本不适用于Windows服务

时间:2018-03-01 13:18:45

标签: c# async-await windows-services quartz.net

我有一个适用于Quartz 2.6的Windows服务。现在我想调用一些API所以我研究了一下并且知道Quartz3.0及以上版本支持Async/Await。但是使用Quartz 3.0,我的执行函数不会被调用。

主要类

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main(string[] args)
    {
        var myService = new Service1();
        if (Environment.UserInteractive)
        {
            string parameter = string.Concat(args);
            switch (parameter)
            {
                case "--install":
                    ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });
                    break;
                case "--uninstall":
                    ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });
                    break;
            }
            #if DEBUG
                 myService.Start();
            #endif

        }
        else
        {
            var servicesToRun = new ServiceBase[] { myService };
            ServiceBase.Run(servicesToRun);
        }
    }
}

服务类

public partial class Service1 : ServiceBase
{
    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        TestDemoJob1().GetAwaiter().GetResult();
    }


    protected override void OnStop()
    {
        System.IO.File.Create(AppDomain.CurrentDomain.BaseDirectory + "OnStop.txt");
    }

    public void Start()
    {

        OnStart(new string[0]);
    }
    public static async Task TestDemoJob1()
    {
        IScheduler scheduler;
        var schedulerFactory = new StdSchedulerFactory();
        scheduler = schedulerFactory.GetScheduler().Result;
        scheduler.Start().Wait();
        int ScheduleIntervalInMinute = 10;//job will run every minute
        JobKey jobKey = JobKey.Create("DemoJob1");
        IJobDetail job = JobBuilder.Create<DemoJob1>().WithIdentity(jobKey).Build();
        ITrigger trigger = TriggerBuilder.Create()
            .WithIdentity("JobTrigger")
            .StartNow()
            .WithSimpleSchedule(x => x.WithIntervalInSeconds(ScheduleIntervalInMinute).RepeatForever())
            .Build();
        await scheduler.ScheduleJob(job, trigger);
    }
}

职业分类

public class DemoJob1 : IJob
{
    public DemoJob1()
    {
    }
    public Task Execute(IJobExecutionContext context)
    {
       //Some Async Task
        return Task.FromResult(0);
    }

}

如果我尝试在控制台应用程序中运行相同的应用程序,则此方法有效。但是,如果我尝试使用Windows服务应用程序运行它。执行功能永远不会被执行。任何帮助,将不胜感激。在过去的3个小时左右,我被困在这里。已经尝试了很多方法,但没有一个方法正在发挥作用。

0 个答案:

没有答案