我有一个预定的工作,每5分钟重复一次。它工作正常。
但我的情况是,我的第一份工作没有在5分钟内完成,第二份工作正在开始(因为它安排了5分钟)。
我不想那样做,一次只能做一份工作。我怎样才能做到这一点?
这是我的代码:
ISchedulerFactory schedFact = new StdSchedulerFactory();
IScheduler sched = schedFact.GetScheduler();
Trigger emailTrigger = TriggerUtils.MakeMinutelyTrigger(5);
emailTrigger.StartTimeUtc = TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow);
emailTrigger.Name = "EmailTrigger";
JobDetail emailJobDetail = new JobDetail("EmailJob", null, typeof(EmailJob));
sched.ScheduleJob(emailJobDetail, emailTrigger);
sched.Start();
答案 0 :(得分:32)
Quartz.NET 2.x
实施IJob
并使用[DisallowConcurrentExecution]
属性装饰您的工作类。有关详细信息,请阅读DisallowConcurrentExecutionAttribute
的API文档。
Quartz.NET 1.x
使作业类实现IStatefulJob
而不是IJob
。有关详细信息,请阅读IStatefulJob
的API文档。
http://www.quartz-scheduler.net/documentation/faq.html#howtopreventconcurrentfire
答案 1 :(得分:1)
我曾经使用过Quartz.net,但从未调查过在作业之间强制执行串行处理。根据我的经验,Quartz更适用于“并行”预定处理,如果作业运行时间很长,那么作业就会重叠,所以我不确定它是否支持你所需要的。
您的问题的简单解决方案可能是使用可由任何作业线程访问的同步变量(例如,锁,互斥,信号量或全局布尔值等)。当一个新工作启动时,它应检查锁定,如果它是空闲的,抓住它,并按住它直到它完成。如果另一个作业醒来,并且看到前一个作业仍在运行,则新作业可以退出,并等待调度程序在下一个间隔再次尝试。您也可以让新工作等待上一个工作完成,但是如果您这样做,则会冒着堆积等待执行的工作风险,并且系统永远不会“赶上来”。