2012-02-09 52 views
0

我知道我總是在這裏找到很好的答案,所以我有一個新的具有挑戰性的問題。至少對我來說這真的很有挑戰性。如何動態設置最佳計時器間隔?

這是一個場景:我有一些工作(讓我們說他們中的很多人)。其中一些應該以小秒數間隔執行,其中一些間隔可以是幾小時。我把這些工作列入清單。

現在,我使用一個計時器來安排它們。但是,讓我們說,我有4個職位:

  • JOB1 - 每5秒
  • 作業2 - 每8秒
  • 作業3 - 每23秒
  • 作業4 - 每10小時。

現在,我應該將計時器設置爲最多5秒,以便它可以按照指定執行job1。但是8秒鐘的job2每10秒執行一次。當然......我可以選擇2秒鐘之類的東西......但是現在......每當計時器超過時間間隔時都會檢查job4,這會導致性能泄漏(正如我所說的,我有很多這樣的工作如此大名單)。

所以我在想,也許我可以使用多個計時器,並將他們的執行間隔分配到一些工作桶中,這聽起來像是最好的選擇......我只需要一個聰明的想法,這個。

這是我的問題...有什麼建議嗎?

+3

您需要將您的一些問題標記爲已回答(如果他們提供了答案),以便您繼續在此處獲得優秀答案 – wal 2012-02-09 06:28:44

+0

我會使用System.Threading.Tasks中的任務,每個任務都有自己的計時器對象(.NET有更多類型的計時器,這裏我會使用System.Threading.Timer)。 – gsscoder 2012-05-31 15:26:45

回答

0

我會創建一個計時器,只檢查是否需要啓動一個作業,並給該計時器一秒的時間間隔。它所做的只是檢查是否應該開始作業:將作業傳遞給要執行的線程或線程池。

由於多餘的檢查可能會失去一些性能,並且如果作業列表很長並且間隔時間很長,則可能會切換到其他設置:爲下一個作業必須啓動時和傳遞後設置一個計時器作業到線程(池)計算間隔,直到下一個作業應該啓動並調整/設置計時器。當你這樣做時,請記住,當你添加/刪除/更新作業時,你將不得不檢查計時器是否需要調整。

0

您原本有正確的想法:運行一個計時器並記錄每個事件的經過時間間隔。創建只有一個定時器比多個定時器更受歡迎。

當你談論1到5秒的差異時,你在問題中提出的擔憂並不重要。無論如何,Windows定時器根本沒有那麼精確的分辨率。

0

如果您只有幾項工作,則可以使用包含作業下一次運行時間的簡單List<Job>。讓計時器每秒打一次,檢查需要運行的作業列表並運行它們。作業完成後,它會更新下一次運行時間。

如果您有很多作業,請創建一個優先級隊列,以便在下一次運行時對作業進行排序。然後,您每秒一次的勾號就可以檢查隊列中的第一個項目。如果需要運行,則將其出列,開始運行,然後檢查隊列中的下一個項目。使用優先級隊列將減少您的每秒一次定時器必須執行的工作量。當然,當作業完成時您需要通知,以便處理程序可以更新下一次運行時間並重新排列作業。