2010-09-27 41 views
2

對於一個工作項目,我正在開展一項任務,該任務將會看到我創建一個將全天候運行的C#.NET Windows服務。該程序將基本上簡單地將文件(基於給定路徑和正則表達式)在各個位置之間移動 - 從/到HTTP,網絡路徑和FTP。管理員將通過ASP.NET中的管理頁面安排這些作業,其中所有作業都將存儲在數據庫中。看起來最難的部分是安排這些工作 - 將任務安排在特定時間的特定時間運行非常簡單,但它也需要足夠強大以允許任務每天,每週一天,每一天都運行的月份,甚至每隔幾秒鐘/分鐘。我得出結論,存儲此調度信息的最簡單方法是在數據庫中使用cron語法(http://adminschoice.com/crontab-quick-reference)。C#中數據庫驅動的「計劃任務」應用程序 - 需要一些建議re cron語法

該應用程序有一個計時器來檢查數據庫的變化每10分鐘,但我有的主要問題是要檢索要執行的任務 - 我想一個選項是簡單地檢索每10分鐘的一切,並且檢查每一行,看看它們是否會被執行。但我覺得這是一個非常低效和技術上懶惰的方式 - 你們會怎麼做呢?

我知道Windows計劃任務將是一個更簡單的方法,但似乎我的老闆不希望這樣。

在此先感謝任何能提供一些提示/建議的人。

+3

找一位瞭解使用正確工具進行正確工作的新老闆? – Oded 2010-09-27 21:04:47

+0

你有沒有考慮使用Quartz.Net來編程呢?這似乎是一個合適的選擇(http://quartznet.sourceforge.net) – 2010-09-27 22:59:52

回答

0

如果您必須跟蹤的任務數量不是很大,您可以維護內存中所有任務的優先級隊列。節點將包含記錄密鑰(來自數據庫)和計算出的下一個更新日期/時間。

當程序啓動時,從數據庫中讀取每條記錄並構建優先級隊列。建立隊列後,查看第一個項目的日期並設置一個定時器,以便在那個時候喚醒。當計時器喚醒時,執行所有到期的任務,重新計劃它們的下一個更新日期/時間,找到下一個需要更新的項目,並設置一個計時器以在該時間到來時喚醒。

要處理修改,您可以讓Web應用程序修改事件以通知您的服務。您必須取消現有計時器並重新計劃,但除了啓動時,您不必讀取整個數據庫。

這就是說,我同意@Oded:說服你的老闆使用Windows計劃任務。如果他不喜歡該界面,可以讓您的Web應用程序(或Web應用程序與之通信的服務)與Windows任務計劃程序API交談。 Codeplex有一個包裝:http://taskscheduler.codeplex.com/

0

看看Quartz.NET - 幾乎完全是你想要的。您也可以使用Cron expressions來安排它。

如果您存儲了有關數據庫中每項作業的足夠信息,則每次開始服務時都可以創建作業。您可以定期輪詢更改並更新作業規則。

將此託管在Windows服務中是一種很好的方法 - 可以監視它的運行情況,並提供標準機制,以便在崩潰時重新啓動它(net start xxx)等。比預定任務好得多。

相關問題