我正在使用Quartz.net的最新3.0.6版本,我希望安排一个进程每天运行(当前示例是每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对象或其他东西? 有人有类似的问题吗? 似乎我确实按照文档做了eryerything,但是我仍然无法正常工作

#1楼 票数:1

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

看,您已将execute方法定义为async void 结果,您无法通过await execute()调用它,因此

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

换句话说,将代码更改为async Task execute()await execute()并再次对其进行测试。


对于更多理论,我建议您阅读以下内容: async / await-何时返回Task vs void? msdn:异步/等待-最佳做法

  ask by user122222 translate from so

未解决问题?本站智能推荐:

1回复

如何获取现有时间表并在quartz.net上编辑触发器?

如何从quartz.net获取现有时间表并编辑触发器触发时间之一? 请指教。 我是quartz.net的新手,在Quartz.net文档中对此没有任何示例。
1回复

将Quartz工作限制为特定工人

我有一个运行在crystal.net上的Web应用程序的调度程序引擎,该引擎运行良好。 该调度程序处理许多日常但重要的任务,例如发送日常电子邮件等。 但是,我现在对该应用程序有新的要求,带来了一些高频作业(每秒1个作业)。 理想情况下,我将使用相同的作业队列并已构建所有错误处理和通知来
1回复

当前作业完成后关闭Quartz调度程序

我在Windows服务中使用Quartz进行作业调度。 服务停止或用户更改作业运行频率时,我需要关闭调度程序。 因为我想等待正在执行的作业,所以我使用 在这两种情况下,我都有例外: Quartz.UnableToInterruptJobException:无法中断作业“ myJob
1回复

Quartz.net多线程和线程安全

我最近开始使用quartz.net,我有一个关于线程安全的问题。 在上面的例子中,我有一个有两个触发器的工作。 我的问题是这两个触发器在运行时是否共享同一个作业实例? 或者每次触发器运行时都会创建一个新的 IJobDetail 实例。 我曾尝试阅读quartz.net 的文档,但它非常令人困惑,因为
1回复

使用SQLServerAdoJobStore配置Quartz.NET

我在尝试让Quartz.NET与AdoJobStore一起工作时遇到了麻烦。 这里没有其他问题似乎遇到了我的问题。 我能够在没有AdoJobStore配置的情况下使其工作正常,但是最终会保留所有内容,但是在尝试GetScheduler()时我得到了一个我无法弄清楚的错误。 这是我的qua
1回复

Quartz.Net更改JobDetail/JobKey的属性

从版本1.0.x迁移Quartz.net时,我遇到了JobDetails和JobKeys的各种属性“缺少设置器”的问题。 例如,虽然可以在版本1.0.x中设置JobKey的“组”或JobDetail的“ JobDataMap”或属性“ Durable”,但在2.3.2版本中不再可用,因为设置
1回复

在不带数据库的C#独立应用程序中,如何计划具有持久性的作业(不带数据库的Quartz.net?)

我正在开发没有数据库的.net C#独立应用程序,我需要在应用程序中触发每日/每周任务。 我找到了Quartz.net库,但它似乎可以在不使用DB的情况下持久存储作业(可以关闭应用程序/机器,但我仍然希望保存作业计划数据)。 您是否知道一种保存在文件中的方法或另一种实现它的方法? 我还需要
1回复

ASP.Net应用程序中的Quartz.Net

刚刚下载了Quartz.Net,请阅读过时的文档,最后得到的代码我认为是正确的。 (如果不是,请告诉我) 我把它放在我的ASP.Net应用程序的Application_Start中,代码被执行但作业没有运行。 我想我在某处读到将Quartz设置为单例,但不确定我是否已经在这里完成了?