2010-12-23 111 views
2

假設我有一個帶有表的數據庫,此表中的每個記錄都與要執行的操作相對應。這個表格有一個日期時間字段,在該字段中存儲下一個動作應該執行的時刻。運行定時任務

此表正在被windows服務讀取,並且操作存儲在數據結構中。每隔幾分鐘,服務將讀取表格,並將新操作合併到數據結構中,同時創建的操作不會錯過。

每個動作都有一定的重複間隔。當某個操作已經運行時,日期時間字段會根據該時間間隔更新到下一個應該運行的時間。

現在,我在這裏想知道正確的行動方案:在給定的時間,實際開始行動的首選方式是 ?

假設我有一個應該在09:00在數據結構中運行的操作,我如何確保在09:00觸發? 我目前想要的是每分鐘檢查一次數據結構,比較當前時間和動作的計劃時間,如果它們匹配,則執行動作並根據其相關時間間隔更新動作的執行時間。

作爲一個數據結構,我傾向於在隊列中考慮,所以我可以在前面做下一個工作,而且只需要檢查第一個,但是隨後我需要在每次發現新操作時重新排列隊列。

我的興趣點主要是檢查是否應該執行一個動作,一個合適的數據結構將遵循的好方法。表中的操作數量非常低,不超過25個。我無法控制數據庫,因此一切都應在C#中以編程方式完成,以防您不知所措。 任何提示,經驗或意見的建議?

+0

你 - 需要 - 一個數據庫?誰啓動計劃任務? – 2010-12-23 15:13:58

+0

取決於系統;在一個數據庫(或類似的)你可以堅持系統狀態,以防系統崩潰。 – 2010-12-23 15:15:10

+0

是的,需要數據庫作爲添加新操作等的中心點。當然,這只是系統的一小部分。討論的唯一問題應該是時間被檢查的方式。 – Oxymoron 2010-12-23 15:21:49

回答

1

說粒度是1分鐘。我會有一個線程頻繁輪詢數據庫,並在下一分鐘更新一系列的事情。一個單獨的計時器線程可以在分鐘結束時啓動該動作列表。

當你進入細節就有點複雜,因爲你可能要保持緊繮繩它,以及相關聯的狀態機(編寫,運行,完成等)上。

+0

這是關於我的想法,並想知道這是否是優先選擇的方式。 – Oxymoron 2010-12-23 15:19:30

0

SQL Agent似乎是一個不錯的選擇,但是你不會得到客戶端應用程序的反饋。

0

,如果你有一個計時器實例作爲數據結構的一部分,並安排它時,這個動作是由於運行一次什麼。這樣您就不必檢查,只要將結構放入隊列或列表中,就知道它已計劃運行。計時器會觸發一個單獨的線程,所以你的代碼將運行異步到會談到數據庫的一部分...