9

我有一个预定的工作,每 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();
4

2 回答 2

33

石英.NET 2.x

使用属性实现IJob并装饰您的工作类。[DisallowConcurrentExecution]阅读 API 文档以DisallowConcurrentExecutionAttribute获取更多信息。

石英.NET 1.x

使作业类实现IStatefulJob而不是IJob. 阅读 API 文档以IStatefulJob获取更多信息。

http://www.quartz-scheduler.net/documentation/faq.html#howtopreventconcurrentfire

于 2010-10-09T18:19:28.253 回答
1

我曾经使用过 Quartz.net,但从未研究过在作业之间强制执行串行处理。根据我的经验,Quartz 更适用于“并行”预定处理,如果它们运行时间长,作业可能会重叠,所以我不确定它是否支持你需要的东西。

您的问题的一个简单解决方案可能是使用任何作业线程都可以访问的同步变量(例如锁、互斥锁、信号量或全局布尔值等)。当一个新工作启动时,它应该检查锁,如果它是空闲的,抓住它,并保持它直到它完成。如果另一个作业唤醒,并且看到前一个作业仍在运行,则新作业可以退出,并等待调度程序在下一个间隔重试。您也可以让新作业等待前一个作业完成,但如果这样做,您将面临作业堆积起来等待执行的风险,并且系统永远不会“赶上”。

于 2010-10-09T06:12:26.590 回答