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

Why does my Quartz trigger fire before the specified interval?

我的 objective 是让 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 次迭代都在秒表上的 20 毫秒或 21 毫秒时触发。之后,它们每 200 毫秒一次发射,直到它在 1000 毫秒左右变得稳定,然后按预期开始每 40-42 毫秒发射一次。

如果前一个作业在 40 毫秒内被触发,我如何防止 Quartz 触发作业?

这种行为的根源是什么?

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

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

Quartz 可以为您做很多事情,但在这种情况下,如果您有这些要求,我只会使用自定义线程或定时器实现。