C# 在工作时间/工作日内每5分钟调用一个方法-Quartz.net

C# 在工作时间/工作日内每5分钟调用一个方法-Quartz.net,c#,scheduled-tasks,quartz-scheduler,scheduler,quartz.net,C#,Scheduled Tasks,Quartz Scheduler,Scheduler,Quartz.net,简言之,我希望每5分钟调用一个方法,但只在工作时间内调用。起初,我试图使用Thread.Sleep(),每次调用时,我都试图计算睡眠时间。不知何故,它并没有起到很好的作用 下面是计算睡眠时间的代码 void Main() { while(true) { Work() Thread.Sleep(GetSleepTime()); } } int GetSleepTime() {

简言之,我希望每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;
    }
void Main()
{
while(true)
{
工作()
Sleep(GetSleepTime());
}
}
int GetSleepTime()
{
整数时间=0;
var now=DateTime.now;
var isWorkingTime=false;
开关(现在为DayOfWeek)
{
星期六,星期六:
星期日,星期日:
打破
违约:

如果(now.Hour>=10&&now.Hour,则不需要使用sleep.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();

问题可能重复。这里正确的cron表达式不是
*0/5 10-19**MON-FRI
?我是Quartz.NET的新手,但代码似乎每天都被调用。它是否排除周六和周日?编辑:Rytmis的表达式似乎排除周六/周日,但是否可能使用第二个选项中的触发器代码?版本是的。我忽略了周末。:)我将更新答案。我尝试了以下方法:ITrigger trigger=TriggerBuilder.Create()。WithIdentity(“trigger1”,“group1”)。WithCronSchedule(*0/5 10-19**MON-FRI”)。Build();但是,
System.FormatException:“未实现对同时指定星期几和月日参数的支持。”
发生了。我找到了“.OnMondayThroughFriday()”,并将其附加在EndingDailyAt和WithInterval之间。。。