运行.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",而且还提供超出此范围的实际服务,我会:
添加自定义命令(参见 Dokumentation)
编写不执行任何其他操作但触发该命令的脚本或短程序。
使用 Windows 任务计划程序让 Script/Program 根据所需的计划执行。
优点:
- 您可以保持大部分现有代码基本不变。
- 您有一个由 windows 管理的 "real" 调度程序
- 重启:检查
- 可配置错误处理:检查
- 考虑闰年:检查
- 考虑夏令时:勾选
- ...
编辑
如果 "once-a-month-work" 是该服务的唯一目的,那么这不是合适的申请格式。在这种情况下,我会将其设为控制台应用程序并让 Windows Task Scheduler 计划和 运行 它。您拥有所有 "pros" 并摆脱服务管理。
我有一项使用 .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",而且还提供超出此范围的实际服务,我会:
添加自定义命令(参见 Dokumentation)
编写不执行任何其他操作但触发该命令的脚本或短程序。
使用 Windows 任务计划程序让 Script/Program 根据所需的计划执行。
优点:
- 您可以保持大部分现有代码基本不变。
- 您有一个由 windows 管理的 "real" 调度程序
- 重启:检查
- 可配置错误处理:检查
- 考虑闰年:检查
- 考虑夏令时:勾选
- ...
编辑
如果 "once-a-month-work" 是该服务的唯一目的,那么这不是合适的申请格式。在这种情况下,我会将其设为控制台应用程序并让 Windows Task Scheduler 计划和 运行 它。您拥有所有 "pros" 并摆脱服务管理。