2009-07-28 44 views
0

這不是一個迫切而重要的問題,看起來更像運動。在指定的時刻(windows,.net等)運行repeattive方法(如時鐘)

如何在特定時刻運行某個功能?越精確越好。

例如,我有一個說時間的方法。我想在XX時,XX:15:00(最好是000毫秒),XX:30:00.000,XX:45:00.000運行它。

目前我有一個(幾乎無盡的)循環,它檢查DateTime.Now,計算TimeSpan睡覺時間,睡眠時間爲30秒(如果間隔較大),再次以相同方式睡覺,然後調用功能。

這種方法的副作用是待機模式。看起來OS在喚醒後並沒有減少睡眠時間,所以當我的筆記本電腦在XX:01待機時,在XX:13醒來時,線程仍然會睡着,因此錯過了XX:15: 00.000時刻。

也許有一種更簡單的方式來說「精確地在XX:00:00.000處調用此函數」。

+0

我認爲你可以做的最好的事情就是捕捉睡眠事件的醒來並通知錯過的時間,或者追溯執行錯過的活動。或者,我建議您禁用睡眠模式,如果你想運行這樣一個時間關鍵的服務。 – 2009-07-28 20:54:34

回答

2

Quartz.Net library似乎你在找什麼。這是一個非常靈活的開源作業調度庫,有很好的教程。它似乎也被積極維護(2009年5月發佈的最新版本)

使用此庫,您可以安排具有各種調度模式的作業,其中「在一天中的某個時間點(以毫秒爲單位)」( see features of quartz.net

但我不確定它是否應對待機事件,但是......

0

我只是在較小的時間間隔(比如說10秒,無論您希望的粒度是多少)進行睡眠,並確定您的隊列中的下一個動作是否計劃運行(並運行它)。取決於檢查代碼的效率,您可能會發現需要非常少量的CPU來完成此操作。

您還可以處理時鐘更改(由用戶/時區等重置)的其他邊緣情況,這比處理睡眠/喚醒事件要複雜得多。

0

如果這不需要編碼,您可以使用windows的內置任務執行工具,您可以在控制面板中找到它。不知道確切的標題被稱爲什麼......「計劃任務」或類型......你可以指定一個可執行文件,一個時間點,如果我是正確的,你可以指定一些重複。

我不知道在所有關於此方法的精確觸發的事件......

,當我不得不實施的那種東西,我沒有使用System.Timers.Timer和時間跨度(一種方法能夠定義分辨率)。這種方法從來不是很精確,但也不是必需的。以獲得更好的結果,也許在你啓動這個計時器同步到當前系統時鐘「輪」號,然後,讓我們說,設置的時間間隔打勾每次15分鐘...

問候

1

您可以嘗試捕獲Windows睡眠模式事件,以便Windows進入該模式時,可以將變量設置爲當前時間。然後,當Windows喚醒時,使用該變量計算經過了多少毫秒,以便您可以將計時器同步到正確的時間。看看這個link,它可能會幫助你: