首页 > 解决方案 > QUARTZ.NET 未执行进程

问题描述

我正在使用最新3.0.6版本的 Quartz.net 我想安排一个进程每天运行一次(目前在示例中它是每 40 秒,但我会改变它)我有调用它执行的方法,但它似乎没有开始我应该在“工作”类中启动它的任何过程。我不确定为什么它不触发?

 public static void Run()
    {

        var isRunning = false;
        IServiceCollection services = new ServiceCollection();
        Startup startup = new Startup();
        var serviceProvider = startup.ConfigureServices(services);
        IWindsorContainer _container = serviceProvider.GetService<IWindsorContainer>();
        while (true)
        {
            if (!isRunning)
            {
                isRunning = true;
                var configuration = _container.Resolve<IConfigurationRoot>();
                var _process = _container.Resolve<Process.Process>();
                int secondsForSleep = Convert.ToUInt16(configuration[Enums.SleepTime]);
                {
                    try
                    {
                        execute();
                    }
                    catch (Exception ex)
                    {
                    }
                    finally
                    {
                        isRunning = false;
                        Thread.Sleep(secondsForSleep);
                        _container.Release(_process);
                    }
                }
            }
        }
    }

    public static async void execute()
    {

        // construct a scheduler factory
        NameValueCollection props = new NameValueCollection
        {
            { "quartz.serializer.type", "binary" }
        };
        StdSchedulerFactory factory = new StdSchedulerFactory(props);

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


        IJobDetail job = JobBuilder.Create<Job>()
            .WithIdentity("myJob", "group1")
            .Build();

        ITrigger trigger = TriggerBuilder.Create()
            .WithIdentity("myTrigger", "group1")
            .StartNow()
            .WithSimpleSchedule(x => x
                .WithIntervalInSeconds(1)
                .RepeatForever())
            .Build();

        await sched.ScheduleJob(job, trigger);

    }
}

public class Job : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        JobKey key = context.JobDetail.Key;
        IServiceCollection services = new ServiceCollection();
        Startup startup = new Startup();
        var serviceProvider = startup.ConfigureServices(services);
        IWindsorContainer _container = serviceProvider.GetService<IWindsorContainer>();
        var configuration = _container.Resolve<IConfigurationRoot>();
        var _process = _container.Resolve<Process.Process>();
        Task t = new Task(() =>
        {
             _process.MainProcess();
        });
       t.Start();
        await t;
    }
}

我是否错误地设置IJobDetail了对象或其他东西?有没有人有类似的问题?好像我根据文档做了一切,但我仍然无法让它工作

标签: c#.netquartz-schedulerquartz.netjob-scheduling

解决方案


这不是您问题的直接答案,但如果问题与以下相关,可能会对您有所帮助。

看,您已将execute方法定义为async void. 结果,您不能通过await execute()等调用它

  • 您的块将不会处理方法try-catch中引发的任何异常execute
  • finally块在调用execute()方法后直接运行(不等待方法完成)

换句话说,将您的代码更改为async Task execute()andawait execute()并再次测试它。


有关更多理论,我建议您阅读以下内容:async/await - when to return a Task vs void? msdn:Async/Await - 最佳实践


推荐阅读