1

...当一个作业在下一个执行时间发生时仍在执行时?

例如,如果我有一个工作每 30 秒发生一次,并且在 30 秒后它仍在运行,那么下一个实例会发挥作用还是会等待?

4

2 回答 2

2

简短的回答是将执行一个新作业,除非您从 IStatefulJob 继承,在这种情况下,一次只允许运行一个作业实例。

于 2010-11-02T22:51:44.870 回答
2

正如 TskTsk 回答的那样,您可以实现 IJob 的 IStatefulJob,但有一个问题!如果您的作业执行时间超过 30 秒(因此您有一个或多个作业在等待该作业完成),在其执行后,所有正在等待的作业都会立即触发!要克服这个问题,您需要创建实现 SimpleTrigger 的新类。这个新的触发器类应该已经覆盖了 GetFireTimeAfter。

public class MyTrigger : SimpleTrigger
{

    public MyTrigger(string name,
                     string group,
                     DateTime startTimeUtc,
                     DateTime? endTimeUtc,
                     int repeatCount,
                     TimeSpan repeatInterval) : base(name, startTimeUtc, endTimeUtc, repeatCount, repeatInterval)
    {
    }

    public override DateTime? GetFireTimeAfter(DateTime? afterTimeUtc)
    {
        return DateTime.UtcNow.AddSeconds(RepeatInterval.TotalSeconds);
    }

}

这样下一个作业不会在第一个作业完成后立即执行。

于 2010-11-19T13:49:22.063 回答