2009-04-25 72 views
2

我有一個.net WCF Windows服務運行在應用服務器上,該應用服務器持續監視xml文件的文件夾。 如何使此服務僅在特定時間(01.00小時)每天運行?WCF窗口服務作爲計劃服務

謝謝。

回答

8

您的服務是真正的服務還是隻是一個監視XML文件夾的WCF應用程序?

如果您的WCF服務只是一個普通的應用程序,最簡單的方法是使用Windows中的計劃任務功能(在控制面板中找到)。只需讓應用程序在啓動時檢查文件夾,並設置一個計劃任務,隨時啓動應用程序。

如果目標應用程序是真正的Windows服務,則需要使用內部計時器。看看System.Timers.Timer類。

public void OnLoad() { 
    Timer timer = new Timer(); 

    // Add event handler 
    timer.Elapsed += WorkMethod; 

    // Give us more control over the timer. 
    timer.AutoReset = false; 

    SetupTimer(timer); 
} 

// Setups the timer for the next interval and starts it. 
private void SetupTimer(Timer timer) { 
    timer.Interval = GetNextChecktime().Subtract(DateTime.Now).TotalMillisecond; 

    timer.Start(); 
} 

private void WorkMethod(object sender, EventArgs e) { 
    // Do work here 

    // Setup the timer for the next cycle. 
    SetupTimer((Timer)sender); 
} 

private DateTime GetNextChecktime() { 
    // Return the next time the service should run as a datetime. 
} 

之所以使用SetupTimer而不是隻使用自動復位=真這將自動重複是將計時器與GetNextChecktime同步()。只需使用24 * 60 * 60 * 1000毫秒即可,因爲經過的計時器將提供24小時的相位,但您需要在01:00開始腳本以便每天在01:00運行腳本。

如果您仍然可以影響應用程序的運行方式,我實際上會推薦第一種方法。除非在服務中有更多的功能或需要維護一些持久狀態,否則只需要有一個應用程序在啓動時監視該文件夾然後退出就更簡單了。由於調度是由Windows完成的,調試起來也更容易,而且容易出錯。

+0

什麼,如果我的WCF服務是一個Web服務 – 2009-08-17 06:01:28

2

如果您需要每天運行一次或兩次(甚至每週一次)運行您的服務,我會創建一個控制檯應用程序,並使用Windows「計劃任務」安排它在這些選定時間運行。這樣,只有Windows系統本身會檢查是否已經到達「正確」時間來喚醒您的服務並進行處理。

如果您的服務需要全天候運行,只在給定的時間窗口內處理消息,那麼Windows(NT)服務可能是您的選擇,它可以在後臺運行,在服務器上運行而無需用戶登錄,並且可以執行各種操作,如檢查看看它是否需要工作,如果沒有,它可以繼續睡在:-)

從我的經驗來看,服務編程和調試有點棘手 - 如果你可以打包你的邏輯到一個獨立的控制檯應用程序並按預定的任務運行它,我更喜歡這個解決方案。這很容易,而且很好地訣竅。

馬克

+0

是否有可能在執行時以這樣一種方式,它不會顯示一個窗口安排一個控制檯應用程序?我懷疑這件事情很重要,因爲不應該有人看到01:00 - 但出於好奇。我想我在某個時候嘗試過,沒有太多的運氣。 – 2009-04-26 09:09:30