工作期间每 5 分钟调用一个方法 hours/days - Quartz.net

Invoke a method every 5 minutes during working hours/days - Quartz.net

简而言之,我想每 5 分钟调用一个方法,但仅限于工作时间。起初我试图使用 Thread.Sleep() 并且在每次调用时,我都试图计算睡眠时间。不知何故,它并没有很好地工作。

这是计算睡眠时间的代码。

    void Main()
    {
       while(true)
       {
         Work()
         Thread.Sleep(GetSleepTime());
       }
    }

    int GetSleepTime()
    {
        int time = 0;
        var now = DateTime.Now;
        var isWorkingTime = false;

        switch (now.DayOfWeek)
        {
            case DayOfWeek.Saturday:
            case DayOfWeek.Sunday:
                break;
            default:
                if (now.Hour >= 10 && now.Hour <= 19)
                {
                    time = 5 * 60 * 1000;
                    isWorkingTime = true;
                }
                break;
        }

        if (!isWorkingTime)
        {
            int remainingDays = 1;
            switch (now.DayOfWeek)
            {
                case DayOfWeek.Friday:
                    remainingDays = 3;
                    break;
                case DayOfWeek.Saturday:
                    remainingDays = 2;
                    break;
            }

            DateTime nextWorkingday = now.AddDays(remainingDays).Date;
            DateTime nextWorkingday10 = nextWorkingday.AddHours(10);
            time = (int)(nextWorkingday10 - now).TotalMilliseconds;
        }

        return time;
    }

Quartz.NET 适合这个东西吗?如果是这样,我怎样才能用它做同样的事情?

你不需要使用睡眠。 Quartz.net 旨在处理调度部分。 您需要创建一个作业及其触发器。

* 0/5 9,17 * * MON-FRI

上述触发器将从上午 9 点到下午 5 点每 5 分钟执行一次作业

以下是备选方案:

如果您使用的是 v2+,则可以在代码中使用以下触发器定义。

ITrigger trigger = TriggerBuilder.Create()
    .WithIdentity("trigger1", "group1")
    .WithDailyTimeIntervalSchedule(
        x => x.StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(9, 0))
                 .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(17, 0))
                 .OnMondayThroughFriday()
                 .WithIntervalInMinutes(5))
    .Build();