我能够使用一个每30分钟执行一次功能的计时器来构建一个Windows服务。
我想让这个功能每半小时执行一次,例如。 00:00,00:30,01:00。
现在可以这样做,但我必须在14:00开始服务,所以它遵循这种模式(每30分钟)。
我想自动化这个,所以如果我开始服务14:08它仍然会在14:30而不是14:38执行。
额外信息: 这是我用于计时器的功能
oTimer = New Timer()
oTimer.Interval = 900000
AddHandler oTimer.Elapsed, AddressOf OnTimer
答案 0 :(得分:0)
我建议使用Windows计划任务或定时调度库,如Quartz.Net。这说明这个要求很简单,你可以自己快速建立这个。
计时器有适当的时间。这是第一次打勾所需的时间。之后将使用间隔时间。将到期时间设置为现在和下一次执行之间的差异(在您的情况下为TimeSpan.FromMinutes(30 - 08)
)。
您还可以使用循环:
CancellationToken ct = ...; //Signal this token when you want to shut down the service
while (true) {
var nextDueTime = CalculateDueTime();
var delay = nextDueTime - DateTime.UtcNow;
try {
await Task.Delay(delay, ct);
}
catch (OperationCancelledException) {
break;
}
DoWork(ct);
}
循环解决方案很有吸引力,因为它避免了典型的计时器问题,例如在计时器停止后到来的并发滴答和滴答。