【问题标题】:How to run a script at random intervals如何以随机间隔运行脚本
【发布时间】:2010-10-28 07:46:41
【问题描述】:

我想在 c# 中编写一个批处理作业,它以随机(ish)间隔运行任务,例如每小时 +/- 20 分钟,如果不需要更新,则在最后一次运行之前等待 x2。

最好的方法是什么?

【问题讨论】:

    标签: c# .net batch-file scripting random


    【解决方案1】:

    如何将上次“不必要”运行的时间戳记录到数据库/某个永久位置?然后,你的第一行可以说:

    LastRunWithoutUpdating = GetLastRunWithoutUpdating() // load from file, or db...
    if (LastRunWithoutUpdating - CurrentTime < DelayInterval) {
        SkipThisRun(); // sys.exit() or something
    }
    

    【讨论】:

    • 除非您的程序可以访问调度程序,否则您将需要某种持久存储,或者进程需要进行自己的调度(即熬夜和 Sleep()ing)。那么,将“上次更新”值写入文件怎么样?
    • 可能还有一些我需要存储的其他值
    • 我们现在将文件的最后修改日期用于类似目的。成功运行会修改文件。不成功的运行不会。文件的年龄是自上次成功以来的时间度量。为了保持一致性,我们还将日期字符串或任何其他有用的检查点信息写入文件,但我们的应用程序只查看文件的日期。
    • 不知道该说什么。如果您需要存储多个值,请继续执行此操作。 C# 擅长处理 XML。
    【解决方案2】:

    其他人的答案都很好,但我在这里唯一可以贡献的是你不应该做的事情。不要不要使应用程序成为 Windows 服务。我已经多次看到它作为类似问题的答案。这不是 Windows 服务的用途。

    在我的书中,windows服务是挂在后台以方便其他程序的应用程序/程序,或者不需要用户输入来操作。它不能用作按时间间隔启动程序的方法。

    【讨论】:

    • 嗯,你说得对,除非必要,否则它不应该是一项服务。不过,服务是确保始终运行的好方法,即使用户已注销或机器已重新启动。听起来他可能想要那个。
    • 如果这是他想要的功能,那么他会无视我的回答。但这只是我想在公共场合抓挠的痒。
    • 我很高兴看到它在屏幕上的回显,这样我们就可以知道它正在工作。因此将避免编写服务。
    【解决方案3】:

    可以创建一个每隔一段时间就会弹出的计时器并运行一个方法。

    示例:

    Timer ProcessTimer = new Timer(new TimerCallback(ProcessRandomTask), null, 0,Timeout.Infinite);
    
    
    private void ProcessRandomTask(object data)
    {
     //Do work
    
      lock(ProcessTime)
      {
           //change timer
           ProcessTimer.Change(GetNewTime(), Timeout.Infinite);
      }
    }
    

    【讨论】:

      【解决方案4】:

      考虑创建一个简单的应用程序,并使用 Windows 任务计划程序启动它。调度程序让您可以对运行的时间和内容进行大量控制,其中包括时间随机化。

      编辑:错过了“2x”部分。过去,我构建了 Windows 服务来执行此操作:

      sleep(1x +/- random(20 minutes))
      if nothing to do, sleep(2x +/- random(20 minutes))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-08
        • 2021-03-16
        • 1970-01-01
        • 2020-12-13
        • 1970-01-01
        • 2021-12-04
        • 2019-12-23
        相关资源
        最近更新 更多