2011-03-31 106 views
1

嗨我已經創建了一個Windows服務,並且在那裏有兩個不同的計時器變量。第一個每5秒發射一次,然後做它需要做的事情。第二個每30秒發射一次。在同一代碼中以不同的時間間隔觸發兩個不同的計時器變量問題

我確保當函數得到執行時,禁用兩個定時器,並在函數完成後啓用。

我的問題是我的第二個更長的時間(30秒)計時器從不會觸發第一個射擊。我在3個月前創建了這項服務,到現在爲止工作情況良好。但是現在我沒有看到定時器在我創建的一個簡單的Windows應用程序中正常工作以測試其工作。

timerLonger= New System.Timers.Timer() 
    timerLonger.Interval = 30000 
    timerLonger.Enabled = True 

    timerShorter= New System.Timers.Timer() 
    timerShorter.Interval = 5000 
    timerShorter.Enabled = True 

    AddHandler timerLonger.Elapsed, New System.Timers.ElapsedEventHandler(AddressOf Process1) 
    AddHandler timerShorter.Elapsed, New System.Timers.ElapsedEventHandler(AddressOf Process2) 

Sub Process1() 
    timerLonger.Enabled = False 
    timerShorter.Enabled = False 
    DoProcessing1() 
    timerShorter.Enabled = True 
    timerLonger.Enabled = True 
End Sub 

Sub Process2() 
    timerLonger.Enabled = False 
    timerShorter.Enabled = False 
    DoProcessing2() 
    timerShorter.Enabled = True 
    timerLonger.Enabled = True 
End Sub 
+0

可能在添加處理程序後設置'Enabled'?另一方面,更可能的原因可能是線程問題。請參閱[文檔](http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx)。我認爲你應該每個線程只使用一個計時器。 – 2011-03-31 17:36:11

回答

4

當您禁用然後重新啓用較長的計時器,它重置其時間。由於較短的一次經常發射6次,所以它永遠沒有機會執行。

而不是禁用定時器,如果目標是阻止兩個定時器的同時操作,請考慮在您的方法周圍使用某種形式的同步,例如SyncLock。

+0

我剛加入synclock而不是禁用定時器,它工作。非常感謝。 – Abbi 2011-03-31 19:53:31

+0

我對此還有一個問題。我試圖禁用定時器,因爲某些處理可能需要超過40秒,所以我不希望在所有處理完成之前觸發任何定時器。這就是我把它放進去的原因。但我不知道synclock是否可以處理這個問題。 – Abbi 2011-03-31 21:20:11

+0

@Abbi:你最終會得到兩個事件,一個接一個。計時器仍然會啓動,但SyncLock會阻止處理,直到第一次完成。 – 2011-03-31 22:02:30

1

由於未處理的異常,您正在暴露自己的破損。不幸的是,System.Timers.Timer類在觸發Elapsed事件時會在沒有任何診斷的情況下吞下異常。在你的情況下,這也會使定時器永久禁用,因爲異常繞過了再次啓用它的語句。請務必在您的Elapsed事件處理程序中始終使用Try/Catch/Finally關鍵字。

或者使用System.Threading.Timer類,它是一個全能更好的計時器類。它不會吞食例外。

+0

感謝您的寶貴意見。我會把它放在試試看。 – Abbi 2011-03-31 19:54:17

相關問題