VB.NET计时器问题

时间:2009-05-06 16:45:47

标签: windows vb.net windows-services timer

我写了一个VB.NET Windows服务,工作正常。我只有一个问题。我希望服务在半小时和最高时间标记(例如9:00,9:30,10:00,10:30,11:00等等)上执行。我使用以下代码:

Protected Overrides Sub OnStart(ByVal args() As String)
    ' Add code here to start your service. This method should set things
    ' in motion so your service can do its work.
    Dim oCallBack As New TimerCallback(AddressOf TimedEvent)
    oTimer = New System.Threading.Timer(oCallBack, Nothing, 300000, 300000)
    EventLog.WriteEntry("CCFinalizeService has begun successfully." , _
                        System.Diagnostics.EventLogEntryType.Information)

End Sub

但是,如果服务从10:15开始,则此代码可以正常工作,然后在10:15,10:45,11:15,11:45执行。如何制作它始终在30分钟和最高时间标记上执行?

4 个答案:

答案 0 :(得分:2)

您可以对其进行更改,以便在启动时根据当前时间计算出达到半小时增量所需的时间。基本上,您的第一个计时器将<300000,然后切换到每300000。

或者,您可能需要考虑使用Windows Task Scheduler而不是将其作为服务。任务计划程序允许您指定运行应用程序的特定时间。

答案 1 :(得分:0)

最简单的解决方案可能是在服务启动时通过Date.Now属性测试当前时间。然后,您可以使用第二个计时器启动第一个计时器,但将第二个计时器上的间隔设置为仅在下一个1/2小时或整个小时标记时启动。

或者,在你的启动例程中,有一个无限的while循环来测试当前时间是否在你的标记上。如果没有,则System.Threading.Thread.Sleep(1000)再次测试。

祝你好运!

答案 2 :(得分:0)

也许是这样的事情?

 If Now.Minute <> 0 Or Now.Minute <> 30 Then
    Thread.Sleep((30 - Now.Minute) * 60 * 1000)
 End If

答案 3 :(得分:0)

您只需要在Timer创建方法

中修改dueTime参数
Dim now As Date = DateTime.Now
Dim dueTime As Integer ' milliseconds to the next half-hour
dueTime = 1800000 - (now.Minute Mod 30) * 60000 - now.Second * 1000 - now.Millisecond
oTimer = New System.Threading.Timer(oCallBack, Nothing, dueTime, 1800000)