2010-02-12 52 views
10

我在asp.net網站中使用下面的代碼。在asp.net中使用System.Timers.Timer

在應用程序初始化我調用InitializeTimer()一次。

代碼的目標是每小時運行一次DoWork()(每小時1次)。

我也希望代碼在每個循環的不同時間執行,所以我添加了隨機部分。

我得到的結果是werid,我無法找到解釋爲什麼發生

代碼2小時後,2小時之後執行的功能,然後再,再經過3小時,則2小時後,2小時和再****

任何人能解釋一下原因嗎?

using System.Timers; 
.... 
private static random = new Random(); 
.... 
public static void InitializeTimer() 
{ 
    tTimer = new Timer(); 
    tTimer.AutoReset = true; 
    tTimer.Interval = TimeSpan.FromHours(1.0).TotalMilliseconds; 
    tTimer.Elapsed += new ElapsedEventHandler(ClassName1.tMailer_Elapsed); 
    tTimer.Start(); 
} 

private static void tTimer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    tTimer.Interval += random.Next(-5, 5); 

    DoWork(); 
} 

更新:

  1. 請不要張貼 「使用Windows服務」,或 「計劃任務」。 我的問題是針對以下代碼我不是在尋找更好的選擇。 此外,在這個測試(10小時),網站是高流量,iis池沒有重新啓動!基於以下MSDN

  2. :(http://msdn.microsoft.com/en-us/library/system.timers.timer.interval.aspx

如果間隔設定定時器 開始後,計數被複位。例如,如果將間隔設置爲5 秒,然後將Enabled 屬性設置爲true,則在啓用設置的時間,計數開始於 。如果將 間隔設置爲10秒,並且計數 爲3秒,則在啓用設置爲true後,第一次引發Elapsed事件 13秒 。

是否有可能重新設置已過期函數的間隔是問題的原因?

這意味着當調用tTimer_Elapsed函數時,計數爲1小時(最小几毫秒) 和我的代碼「tTimer.Interval + = random.Next(-5,5);」正在爲Interval增加另一整小時?

+0

如果取出隨機部分,代碼是否按預期工作? – mpeterson 2010-02-13 01:35:10

+0

我不知道,代碼是在生產服務器上運行的,我現在不能改變它(一個不會有幾天),這就是爲什麼我問這個問題找到解釋。 – RuSh 2010-02-13 10:39:14

+0

那麼這是否意味着它在本地測試時按預期執行? – mpeterson 2010-02-13 16:45:25

回答

4

檢查this出...傑夫阿特伍德實際上討論了類似的東西。我想它是有效的,但根據傑夫的網站超出了這種方法,所以他們去了一個專門的任務。

5

ASP.NET應用程序在不使用時會關閉。如果有人點擊您的網站,然後再沒有點擊,它可以關閉。你的計時器不會觸發。

對於此類維護工作,您希望使用Windows計劃任務或Windows服務。

+0

thx爲輸入。該網站或iis池在測試期間沒有重新啓動。我相信我的代碼有問題。 – RuSh 2010-02-12 22:35:36

+0

@sharru IIS無需用戶干預即可回收您的應用程序。 – 2010-02-13 00:04:39

+1

我意識到這一點,我記錄這些事件,沒有重新啓動發生。 – RuSh 2010-02-13 00:26:21

1

我第二個薩姆建議使用Windows計劃任務每​​小時打一頁。我試圖讓我的工作,它有點工作。我去了一個計劃任務,它從來沒有失敗過。

相關問題