为什么我的Quartz触发器在指定的间隔之前触发?

时间:2015-04-24 18:33:19

标签: quartz.net

我的目标是让Quartz.NET以25Hz或40ms的速度执行工作。

我正在使用以下触发器:

ITrigger MyTrigger = TriggerBuilder.Create().WithIdentity("T1").ForJob("MyJob").WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromMilliseconds(40)).RepeatForever()).Build();

以及以下工作:

[DisallowConcurrentExecution]
private class MyJob : Quartz.IJob
{
    public void Execute(IJobExecutionContext context)
    {
        Idx++;
        Console.WriteLine("Job {0} fired at {1}ms", Idx, MyStopWatch.ElapsedMilliseconds);
    }
}

问题是前150次执行还是太快了。例如,前60次迭代全部在秒表上以20ms或21ms发射。之后,它们每隔200毫秒发射一次,直到它在1000毫秒左右稳定,然后按照预期每隔40-42毫秒开始射击。

如果上一个作业在40ms内被解雇,我如何阻止Quartz触发作业?

这种行为的来源是什么?

1 个答案:

答案 0 :(得分:2)

您不应该依赖Quartz进行毫秒精度调度。 Quartz有很多基础设施(失火检查,补偿等),这使得它不适合这种精度。

我认为在裸机虚拟机级别上稳定启动也可能是一个挑战,因为GC等可能会暂停一些事情。

Quartz可以为你做很多事情,但在这种情况下,如果这些是你的要求,我会选择自定义Thread或Timer。