【问题标题】:How to suspend/resume a progress based on the scheduled time?如何根据预定时间暂停/恢复进度?
【发布时间】:2013-06-07 09:51:32
【问题描述】:

有一些解决方案可以运行调度程序来开始触发。但我的要求也是在最后触发。

我有如下时间表输入:-

  1. 我必须在预定时间开始时恢复进度。
  2. 如果在有效的预定日期范围之间有休息时间,我必须暂停它。休息后恢复。

看起来很复杂的工作。请给我一个更好的方法来解决它。

  • 我有一个计时器。根据上述时间表,它必须计算 2013 年 6 月 11 日 19:16 和 2013 年 6 月 17 日 23:59 之间的时间间隔(因为星期二有自定义时段)。 现在以“恢复”状态启动计时器。
  • 在此计时器过去后,将在 2013 年 6 月 17 日 23:59 到 2013 年 6 月 18 日 06:00 之间计算间隔。现在以“暂停”状态启动计时器。等等……

【问题讨论】:

  • 如果您想在一个程序中完成所有操作,那么您的方法可能是最好的方法。尽管您可能会遇到经过时间和夏令时的问题。你可能对我的 Waitable Timer 感兴趣。见devsource.com/c/a/Languages/Waitable-Timers-in-NET-CSharp。源代码在mischel.com/pubs/waitabletimer.zip
  • 但我需要一个基于时间表的计时器。如果我给出一个像上面这样的时间表,它需要在活动时间范围和非活动时间范围的起点触发。

标签: c# scheduled-tasks scheduling


【解决方案1】:

我假设您在上面显示的调度应用程序将该信息保存到文件中。如果是这样,您可以执行以下操作。

首先,您要执行的进程必须以某种方式被告知它需要关闭。我假设它是某种 Windows 事件或文件或数据库中某个位置的标志,它会定期检查。如果你没有这个设施,那么你将很难安全地完成任务。

有一个小型应用程序(称为 Keeper)从文件中读取计划。然后它会检查您正在安排的程序是否正在运行。如果它正在运行并且该暂停,则发送信号告诉它停止。然后,创建一个计划任务,以便在下次启动时重新启动程序。还要创建一个计划任务,使 Keeper 在下一次挂起时运行。然后 Keeper 退出。

任何时候你修改了时间表,你只需要运行 Keeper 程序,它就会弄清楚它需要做什么:暂停程序,安排程序再次运行,并安排自己在下一次暂停时再次运行时间。

维护计划任务涉及少量复杂性,但还不错。只需让 Keeper 删除 Program 和 Keeper 的任何计划任务,基本上都在维护内容,因此每个任务都不会超过一个。

您需要访问task scheduler API

【讨论】:

  • 请查看我更新的问题。我从 DB 获取调度程序详细信息。我应该只使用一个计时器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
相关资源
最近更新 更多