2010-02-16 53 views
4

我需要實現一個執行數據庫導入的windows服務,並且每月一次。 該程序通過電子郵件接收數據,並將在每個月底導入它們。如何建立一個非常低分辨率的計時器?

有沒有更好的方法比設置程序重複睡眠max_integer秒/毫秒?

+1

它是否會創建一個每月醒來一次的服務?創建一個程序並安排它每月運行它不是更好嗎?例如,您可以使用Windows內置調度程序或nnCron(http://www.nncron.ru/)執行此任務。 – 2010-02-16 13:43:12

+1

我在Windows XP,Vista和Windows 7中使用計劃任務獲得了很好的結果。 – 2010-02-16 13:55:03

回答

16

我不會這樣做的Windows服務。我會將其作爲計劃任務運行。

您的服務只會睡一個月,只是浪費資源。讓操作系統跟蹤時間並開始執行每月一次的應用程序處理。

4

如果你可以避免寫一個窗口服務,你會讓你的生活更輕鬆 - 在這裏計劃任務可能是一個更好的選擇。 Windows服務最適用於需要發生一些不斷後臺活動的情況 - 而不是長時間運行任務。

但是,如果您必須將此服務設爲Windows服務,那麼您不需要設置長時間休眠超時值這絕對是一個有問題的方法。如果您的應用程序重新啓動會發生什麼?它將如何知道它已經睡了多久?或者如果線程重新啓動呢?

一個更好的方法是在數據庫的某個地方編寫一個記錄,以確定下一次導入應該作爲日期/時間發生。您可以定期(每隔幾分鐘或幾小時)喚醒Windows服務,並查看當前日期/時間是否大於該值。如果是,請運行導入並將數據庫中的下一個運行日期更新爲下一次運行日期。

如果您的應用程序已重新啓動,您只需從數據庫中讀取值並繼續。

+0

如果您的應用程序重新啓動,會發生什麼情況? 它從註冊表中讀取最後一次檢查日期時間, ,如果從nowtime到registrytime的delta增量> interval,則執行檢查,如果 2010-02-16 13:49:57

+0

@ user155077:你當然可以做你正在描述的內容,但是這裏存在風險。我會選擇使用數據庫作爲此信息的存儲位置,而不是註冊表。如果發生災難性的服務器故障並且您必須重新構建機器,會發生什麼情況?您很可能會在註冊表中丟失該信息。這是一個遙遠的可能性 - 但我看到它發生。不幸的是,系統註冊表很少被備份。 – LBushkin 2010-02-16 13:53:22

+0

還值得一提的是,根據環境的不同,windows服務可能無法寫入註冊表。最好將它放在一個地方,例如數據庫。 – 2011-02-02 12:39:45

相關問題