运行.Net方法一个月一次

Run .Net method once in a month

我有一项使用 .Net 框架的 windows 服务,需要每月执行一次 "work"。实现这个的最佳方法是什么?

我可以想到以下选项:

1) 执行 "work" 并睡眠 2592000 秒(相当于 1 个月)。

2) 是否执行 "work" 并继续循环直到达到所需的 date/time? (在循环内睡了大约1分钟)。

3) 将其更改为控制台应用程序,并让 windows 调度程序 运行 指定 date/time 的控制台应用程序。

4) 是否有任何其他方法可以强制 .net 在特定 date/time 处启动/继续线程?

使用 Windows 中的任务计划程序是一个不错的常用选项。

另一种选择是使用调度程序库,例如 FluentScheduler。这要求您的应用程序在整个月内都处于 运行 状态,所以我会使用任务计划程序并让它简单地 运行 执行代码,然后让进程完成。

暂停线程或燃烧 CPU 周期一个月 (!) 是无稽之谈,所以忘记 1)2),如果你的过程并不意味着真的很长-运行宁。

您可以创建一个 System.Threading.Timer 对象,它在指定的时间间隔执行回调。
我之前将其用于 windows 服务,并且在该服务中我有一个计时器 属性,如下所示:

public partial class SomeService : ServiceBase
{
    private Timer scheduler = null;

    private Timer Scheduler
    {
        get
        {
            if (this.scheduler == null)
            {
                this.scheduler = new Timer(new TimerCallback(this.ProcessingFunction));
            }
            return this.scheduler;
        }
    }

    protected override void OnStart(string[] args)
    {
        // Set first .Change value to trigger initial execution.
    }

    protected override void OnStop()
    {
        this.Scheduler.Dispose();
    }

    private void ProcessingFunction(object e)
    {
        // Do stuff here
        // Calculate and set next execution time with .Change
    }
}

另请参阅 Timers Microsoft 文档。

假设该服务不仅针对此 "once-a-month-work",而且还提供超出此范围的实际服务,我会:

  1. 添加自定义命令(参见 Dokumentation

  2. 编写不执行任何其他操作但触发该命令的脚本或短程序。

  3. 使用 Windows 任务计划程序让 Script/Program 根据所需的计划执行。

优点:

  • 您可以保持大部分现有代码基本不变。
  • 您有一个由 windows 管理的 "real" 调度程序
    • 重启:检查
    • 可配置错误处理:检查
    • 考虑闰年:检查
    • 考虑夏令时:勾选
    • ...

编辑

如果 "once-a-month-work" 是该服务的唯一目的,那么这不是合适的申请格式。在这种情况下,我会将其设为控制台应用程序并让 Windows Task Scheduler 计划和 运行 它。您拥有所有 "pros" 并摆脱服务管理。