2009-05-06 9 views
2

Ich schrieb einen VB.NET Windows Service, der gut funktioniert. Ich habe nur ein Problem damit. Ich möchte, dass der Dienst zur halben Stunde und zu den besten Zeiten ausgeführt wird (z. B. 9:00, 9:30, 10:00, 10:30, 11:00 usw. usw.). Ich verwende den folgenden Code ein:VB.NET Timer Frage

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 

Dieser Code funktioniert jedoch, wenn der Dienst beginnt um, sagen wir, 10:15, dann führt es aus, um 10:15, 10.45, 11.15, 11: 45. Wie stelle ich es so ein, dass es immer zu den 30-Minuten- und den besten Zeiten ausgeführt wird?

Antwort

0

Sie müssen nur die dueTime Parameter in den Timer-Erzeugungsverfahren vs Service

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) 
+0

Wusste, dass es so einfach sein musste. Vielen Dank! – Icemanind

2

Sie können diese Einstellung so ändern, dass beim Start die Zeit ermittelt wird, die benötigt wird, um ausgehend von der aktuellen Uhrzeit in eine halbe Stunde zu wechseln. Grundsätzlich wäre Ihr erster Timer < 300000, dann wechseln Sie zu jedem 300000.

Alternativ können Sie die Verwendung der Windows Task Scheduler anstelle von dies als Service zu betrachten. Mit dem Aufgabenplaner können Sie bestimmte Zeiten zum Ausführen einer Anwendung angeben.

+0

+1 für geplante Aufgabe ändern –

+0

nicht über eine geplante Aufgabe besteht darin, dass es das System erfordert auf angemeldet sein, ? – BenAlabaster

+0

@balabaster: Nein. Der Taskplaner wird als Dienst ausgeführt und ermöglicht, dass Tasks so eingerichtet werden, dass sie auch ohne angemeldete Benutzer ausgeführt werden. Sie können es so einrichten, dass nur Aufgaben geplant werden, wenn ein Benutzer angemeldet ist, aber Sie können auch festlegen, dass es beim Systemstart, bestimmten Zeiten usw. ausgeführt wird. Es ist ziemlich flexibel. Siehe den Link für Details. –

0

Wahrscheinlich die einfachste Lösung wäre, beim Start des Dienstes die aktuelle Zeit über die Date.Now-Eigenschaft zu testen. Sie können dann einen zweiten Timer verwenden, um den ersten Timer zu starten, aber das Intervall für den zweiten Timer so einstellen, dass er nur bei der nächsten halben oder vollen Stunde ausgelöst wird.

Alternativ können Sie in Ihrer Startroutine eine unendliche While-Schleife verwenden, um zu testen, ob die aktuelle Zeit auf Ihrer Marke steht. Wenn nicht, System.Threading.Thread.Sleep (1000) und erneut testen.

Viel Glück!

0

Vielleicht so etwas?

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