我写了一个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分钟和最高时间标记上执行?
答案 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)