2009-05-06 102 views
2

我寫了一個VB.NET Windows服務,它工作正常。我只有一個問題。我希望服務在半小時和小時標記的頂部執行(例如,9:00,9:30,10:10,10:30,11 :,等等)。我使用下面的代碼:VB.NET計時器問題

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

你只需要修改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) 
+0

知道它必須是這樣簡單的事情。謝謝! – Icemanind 2009-05-06 17:52:13

2

您可以對其進行更改,以便在啓動時計算基於當前時間進行半小時增量所需的時間。基本上,你的第一個計時器將是< 300000,然後切換到每300000.

或者,您可能要考慮使用Windows Task Scheduler而不是做爲服務。任務計劃程序允許您指定運行應用程序的特定時間。

+0

+1的計劃任務服務VS – 2009-05-06 16:50:06

+0

沒有計劃的任務是,它需要對系統進行登錄? – BenAlabaster 2009-05-06 16:53:46

+0

@balabaster:不需要。任務計劃程序作爲服務運行,並且允許任務設置爲在沒有用戶登錄的情況下運行。您可以將其設置爲僅在用戶登錄時計劃任務,但您也可以設置爲在系統啓動時運行,具體時間等。它非常靈活。詳情請參閱鏈接。 – 2009-05-06 17:12:51

0

可能最簡單的解決方案是在服務啓動時通過Date.Now屬性測試當前時間。然後,您可以使用第二個定時器啓動第一個定時器,但將第二個定時器的間隔設置爲僅在下一個1/2小時或滿刻度時刻觸發。

或者,在您的啓動例程中,有一個無限循環,用於測試當前時間是否在您的標記上。如果沒有,System.Threading.Thread.Sleep(1000)並再次測試。

祝你好運!

0

也許這樣?

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