2010-04-07 78 views
6

我可以構建一個Windows服務並進行安裝。每小時運行一次的Windows服務

我很好奇我怎麼能每小時運行一次這項服務?我希望它定期每小時運行一次。

我還需要知道它正在運行的小時範圍,以便我可以將它存儲在某個地方。

我該怎麼做?

編輯:此服務將安裝在許多機器上,因此,我不想在100臺服務器上創建計劃任務。

回答

12

如果你想有一個任務在定期運行,而不是不斷,你應該考慮使用Task Scheduler

如果你需要你的代碼是一個服務,但要每小時「激活」,最簡單的方法是使你的服務成爲一個COM對象,並且每小時調度一個簡單的任務,調用一個jscript/vbscript創建你的COM對象並調用簡單的方法。

另一種方法是使用任何等待API「浪費」一小時而不消耗週期。

請注意,還必須考慮到,依賴於你的情況下一些有趣的設計決策是:

  • 是怎麼回事,如果它崩潰來啓動你的服務或由用戶停止?
  • 如果您在一個多小時後啓動,是否應該再次運行,還是需要等待確切的小時計劃?
  • 如果時區或日光節約時間在您未處於活動狀態時發生變化,您將如何跟蹤上次「激活」時間?
  • 您的服務是否阻止計算機在怠速或筆記本電腦保護蓋關閉時進入睡眠/休眠狀態?如果沒有,您是否需要在一小時內喚醒計算機以使您的服務按照您的時間表工作?

其中有些是由任務調度程序照顧的,所以我強烈建議在路由中等待一小時的代碼。

+0

等待API浪費CPU週期?你能詳細解釋一下嗎?等待只是系統引發的事件,我不認爲它在輪詢任何事情。 – 2011-11-07 07:25:49

+0

我不確定你是否正確理解我。我試圖說,等待一段時間過後,等待的API優化爲不使用CPU週期。 – 2011-11-07 21:56:56

3

您可以創建一個每小時運行一次的scheduled task,以運行該服務或發送消息以「喚醒」。然後,無論是在當前時間傳遞計劃的任務請求,還是讓您的程序在喚醒時獲取當前時間。

Task Scheduler Managed Wrapper可以幫助您以編程方式進行設置;你也可以谷歌的其他資源。

+0

但我想能夠在代碼中實現。想象這個服務將被安裝在許多服務器上,我不想去每個服務器並創建一個計劃任務。 – DarthVader 2010-04-07 02:46:00

+1

@ user177883:您可以以編程方式創建計劃任務,就像您可以以編程方式創建服務一樣。 – 2010-04-07 02:49:42

3

有幾個選項。

  1. 你可以睡一個小時。
  2. 您可能更適合預定任務,而不是服務。
2
Thread.Sleep(1000*60*60); 
+2

如果您嘗試在睡眠一小時時停止服務,會發生什麼情況? – 2010-04-08 08:37:47

2
Thread.Sleep(TimeSpan.FromHours(1)); 

代碼更易讀這樣

2

Thread.Sleep()解決方案將確保您的服務將在一個小時的時間間隔運行,而不是每隔一小時即每個任務將1小時的時間+運行任務開始。考慮在您的服務中使用Timer。這將是一個更強大的解決方案,因爲您可以控制何時運行任務,監視其進度等。請記住,每個Timer事件將在不同的線程中觸發,如果任務花費的時間超過一個小時,您可能會等待第一個任務完成以避免併發任務。

0

任務調度程序可能是一個好主意,但服務旨在執行此操作。服務易於安裝並正確記錄事情。您只需要在服務開始時安裝一個系統計時器(System.Threading.Timer),或者還有一個計時器。

相關問題