作为我创建的Windows服务的一部分,我使用计时器每隔几分钟触发一次功能。但是,我想在一小时内以特定间隔触发这些功能。
用户配置将确定间隔。
示例
因此,基于以上所述,当服务在2:03启动时,需要确保第一个SendData将在2:10发生,而第一个LoadData将在2:55发生。
例如,在运行SendData的同时,计时器将暂停以确保在间隔之前完成SendData。这意味着,如果SendData从2:10开始并花费15分钟,则下一个触发条件将是2:30。
答案 0 :(得分:0)
这是带有WinForms的示例,您可以将其应用于服务。我们计算“目标日期”,然后每秒对它进行检查(如果需要,可以更小一些;它仍然可以工作)。
下面的代码设置为每10分钟间隔一次,但是在任何持续时间内都是灵活的:
Public Class Form1
Private targetDt As DateTime
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
targetDt = GetNextTargetTime(10)
Timer1.Interval = 1000
Timer1.Start()
End Sub
Private Function GetNextTargetTime(ByVal Minutes As Integer) As DateTime
Dim dt As DateTime = DateTime.Today.AddHours(DateTime.Now.Hour).AddMinutes(DateTime.Now.Minute)
While (dt < DateTime.Now OrElse (dt.Minute Mod Minutes <> 0))
dt = dt.AddMinutes(1)
End While
Return dt
End Function
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
If (DateTime.Now > targetDt) Then
Timer1.Enabled = False
' ... do something in here ...
targetDt = GetNextTargetTime(10)
Timer1.Enabled = True
End If
End Sub
End Class
答案 1 :(得分:0)
最简单的解决方案,谢谢@TheDuck
在Windows服务启动中,将时间间隔设置为分钟,然后启动计时器
intSendDataInterval = 10
tmrTest.Interval = 60000
tmrTest.Start()
在过去的事件(然后每分钟发生一次)中,我使用当前分钟和预定间隔执行mod。如果为true,则我停止计时器,调用该函数,然后再次启动计时器。
Private Sub tmrTest_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles tmrTest.Elapsed
If Now().Minute Mod intSendDataInterval = 0 Then
tmrTest.Stop()
SendData()
tmrTest.Start()
End If
End Sub