2009-10-26 100 views
12

定時器的最大時間間隔爲2,147,483,647。大約25天。但在我的要求中,我需要計時器將等待30天。我該如何解決它?請幫忙。最大定時器時間間隔

+2

哪個定時器? .NET中至少有3個不同的計時器! – 2009-10-26 13:29:15

+1

System.Threading; – Wilson 2009-10-26 13:32:04

+7

這不是一個錯誤的方式。一個錯誤是當你的代碼和你的規範不一致時。我想你會發現這是一個有據可查的限制。 – paxdiablo 2009-10-26 13:33:25

回答

22

爲此使用System.Threading.Timer。有longuintTimeSpan而不是intdueTime的構造方法。其中任何一項都會讓您設置30天的時間。

更新:這是做到這一點的最簡單的方法:

System.Threading.Timer _timer; 
public void Start30DayTimer() 
{ 
    TimeSpan span = new TimeSpan(30, 0, 0, 0); 
    TimeSpan disablePeriodic = new TimeSpan(0, 0, 0, 0, -1); 
    _timer = new System.Threading.Timer(timer_TimerCallback, null, 
     span, disablePeriodic); 
} 

public void timer_TimerCallback(object state) 
{ 
    // do whatever needs to be done after 30 days 
    _timer.Dispose(); 
} 
+1

現在你只需要保持你的系統健康和快樂30天。 – 2009-10-26 13:58:02

+3

@亨克:這個問題沒有提及*爲什麼*計時器的時間需要30天。對於我們所知道的,這個計時器可能會被用來發送電子郵件給某人說:「嘿,這臺服務器連續運行了30天」。 – MusiGenesis 2009-10-26 14:00:16

+5

30天,是的。但最大值約爲49天,因爲即使使用int64或TimeSpan版本,它也不會接受超過2 * 32-2毫秒的值。 – RenniePet 2011-06-13 00:11:00

13
int days = 30; 

創建一個定時器一天。

每當定時器啓動時減少days

+2

我同意。定時器並非真正意圖應對延長至30天的時間段,儘管我的計時器每天運行超過一次。 – ChrisBD 2009-10-26 13:33:57

+5

即使使用int64和TimeSpan版本,System.Threading.Timer被限制爲大約49天(2 * 32毫秒)。所以對於一個很長時間的通用計時器來說,這是一個有效的方法。 – RenniePet 2011-06-13 00:51:46

10

您可以隨時讓計時器等待較短的時間,如一天,計時器每次觸發計數器並檢查計數器的當前值。如果值爲30,則執行應該每30天運行一次的代碼。

更好的辦法是將值設置在某個外部文件的某個位置,以便如果程序意外退出,則可以恢復您離開的位置。理想情況下,您可能希望將下一個運行日期放在文件中,以便如果程序關閉多天,則可以恢復並在正確的日期觸發它,而不必擔心上次運行的時間。因此,像

NextRunDate = 2009/10/10 4:40 PM

當程序運行時它會設置提前的日期還有30天。

3

將日期時間變量設置爲日期時間,當您想要執行任何它時...然後,只需讓計時器檢查每分鐘(或任何您需要的準確度級別)以查看該日期時間是否已過去。 。

1

要做到這一點有一個計時器,你還需要一個應用程序,並且沒有中斷30+天運行的PC。並非不可能,但是風險很大。

這聽起來像你想要的東西安排執行。計算目標日期/時間並將其保存爲XML或.config文件。當應用程序重新啓動時,它可以重新計算用於觸發事件的TimeSpan。

4

這是計時器,告訴你你的應用程序更適合作爲計劃任務來實現。

0

計時器的構造函數將採用一個TimeSpan,它是int64肯定會超過25天?

您是否也考慮過系統可能無法保持30天?

只看了一眼,就是10,675,199天。

4

我強烈建議使用Windows Scheduled Task功能,尤其是如果這是爲了在每個月的同一天運行某些功能,因爲月份會在28到31天之間變化。

+1

這不是問題的答案。如果您在給定時間(計劃程序)啓動應用程序,或者正在運行的應用程序在給定時間(計時器)正在執行某些操作,則這是完全不同的。 – 2012-03-28 10:12:44

1

Quartz.NET庫是定期運行代碼的另一種選擇。