C# 基于时间的条件逻辑?

C# 基于时间的条件逻辑?,c#,C#,我希望根据一天中的时间有条件地运行代码。在我的程序生命周期中运行的几个辅助任务中,代码位于while循环中。对每个循环迭代执行比较似乎是浪费,有没有更有效的方法来获得这个期望的结果 在代码中重申我的问题时,我问是否有更有效的方法来复制此功能,可能使用计时器或其他一些调度机制: while( workerNotCanceled ) { var time = DateTime.Now; if (time.Hour > 8 and time.Hour < 16)

我希望根据一天中的时间有条件地运行代码。在我的程序生命周期中运行的几个辅助任务中,代码位于while循环中。对每个循环迭代执行比较似乎是浪费,有没有更有效的方法来获得这个期望的结果

在代码中重申我的问题时,我问是否有更有效的方法来复制此功能,可能使用计时器或其他一些调度机制:

while( workerNotCanceled )
{
    var time = DateTime.Now;
    if (time.Hour > 8 and time.Hour < 16)
        DoWork();
}
while(工作未取消)
{
var time=DateTime.Now;
如果(时间小时>8,时间小时<16)
销钉();
}

我不知道
DoWork()
做了什么,但与之相比,时间比较很可能是可以忽略的。您只能在16:00之后和8:00之前进行大量时间比较。如果循环是在时间范围之外输入的,则可以阻止线程,直到它完成其工作为止。如果是16:00之后,它将一直睡到第二天8:00;如果是8:00之前,它将一直睡到同一天8:00。请注意,使用
Thread.Sleep
时,将无法在工作时间范围外取消循环。如果您想这样做,您可以使用

while(工作未取消)
{
var time=DateTime.Now;
如果(时间小时>8,时间小时<16)
销钉();
否则如果(time.Hour>=16)
{
DateTime nextStart=DateTime.Now.Date.AddDays(1.AddHours(8);
Sleep(nextStart-DateTime.Now);
}
其他的
{
DateTime nextStart=DateTime.Now.Date.AddHours(8);
Sleep(nextStart-DateTime.Now);
}
}

因此,我认为有不同的方法来实现这一点。如果我必须这么做,我可能会改变策略模式,分而治之

分而治之: 将切换/时间检查与实际作业分开。所以,我会想办法把“做好工作”的策略换成“什么都不做”或“放弃工作”的策略

这可以在应用程序内部使用Quartz或类似的调度框架来完成,这将在适当的时间触发“关闭”和“打开”作业

同样可以使用cron或windows任务调度器,它们可以触发应用程序中的api。这打开了一个攻击向量,虽然

战略模式 这在这里相对简单:您有一个带有两个实现的接口。“打开/关闭”作业然后简单地“插入”适当的实现

例如:

interface IWorker{
     void DoWork(); // maybe with an argument
}

class ActiveWorker : IWorker
{
     public void DoWork()
     {
          workerService.DoWork(); // replace with whatever is appropriate for you.
     }
}

class InactiveWorker : IWorker
{
    public void DoWork()
    {
         // Maybe just do nothing?
         // Maybe actively drop a request?
    }
}
在您的消费者中,您将拥有

IWorker worker; // Setup initially based on DateTime.Now

void ConsumingLooper()
{
     //...
     worker.DoWork(); // Based on which impl. is set to 'worker' will
                      // either handle or drop
}

不要忘了添加一些措施,以处理当活套被关闭时活套想要调用
worker.DoWork()
的情况。为了简洁起见,我省略了它,而且有许多不同的方法来实现它。您可能需要选择您最喜欢的作业计划程序。

您可以使用作业计划程序,如windows上的“使用任务计划程序”或windows上的“crontab”linux@shingo ... 做什么?@Fildor做一个新流程的工作或向主流程发送一些信号,尽管我不知道OP想要做什么工作。@shingo是的,有点模糊。这就是为什么我担心仅仅建议使用一些工具X是不够的,但在回答中也很难得到更详细的信息…:(年轻人!你立即被取消了这次比赛的资格。在任何现实的代码中都没有
Thread.Sleep()
)^^Harsh love…:D但我必须同意Tanveer的观点。老人!这就是为什么我用取消令牌链接到这个问题的原因!@someone
Thread.Sleep()
在real code中,无论取消令牌与否,所有类型的代码都不好。考虑到工作负载,即使是
等待任务。Delay()
将不合适,即使这两种类型似乎都能完成任务。OP应该真正考虑使用操作系统提供的调度工具的方法。@TanveerBadar我认为工作量不是很高,因为当程序一直运行时,它将在下午调用一次,然后等待16个小时。我知道<大多数情况下不建议使用code>Thread.Sleep(),但我希望示例尽可能简单,并提供了一个链接,提供了更好的替代方案。此解决方案的最大优点是OP不必对其代码进行严重更改。
IWorker worker; // Setup initially based on DateTime.Now

void ConsumingLooper()
{
     //...
     worker.DoWork(); // Based on which impl. is set to 'worker' will
                      // either handle or drop
}