我有一个预定的工作,每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();
Run Code Online (Sandbox Code Playgroud)
Mar*_*hma 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
我使用过 Quartz.net 一点,但从未研究过在作业之间强制执行串行处理。根据我的经验,Quartz 更适合“并行”计划处理,如果运行时间较长,作业可能会重叠,所以我不确定它是否支持您所需要的。
解决问题的一个简单方法可能是使用可由任何作业线程访问的同步变量(例如锁、互斥体、信号量或全局布尔值等)。当一个新的作业开始时,它应该检查锁,如果它是空闲的,抓住它,并保持它直到它完成。如果另一个作业醒来,并且发现前一个作业仍在运行,则新作业可以直接退出,并等待调度程序在下一个时间间隔再次尝试。您也可以让新作业等待前一个作业完成,但如果这样做,您就会面临作业堆积等待执行的风险,并且系统永远不会“赶上”。
| 归档时间: |
|
| 查看次数: |
4477 次 |
| 最近记录: |