Windows服务以特定的时间间隔触发操作

时间:2019-06-24 17:24:03

标签: .net vb.net

作为我创建的Windows服务的一部分,我使用计时器每隔几分钟触发一次功能。但是,我想在一小时内以特定间隔触发这些功能。

用户配置将确定间隔。

示例

  • 第10次分钟通话 SendData(),例如(2:10、2:20、2:30、2:40等)
  • 55th 分钟呼叫 LoadData(),例如(2:55、3:55、4:55、6:55等)

因此,基于以上所述,当服务在2:03启动时,需要确保第一个SendData将在2:10发生,而第一个LoadData将在2:55发生。

例如,在运行SendData的同时,计时器将暂停以确保在间隔之前完成SendData。这意味着,如果SendData从2:10开始并花费15分钟,则下一个触发条件将是2:30。

2 个答案:

答案 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