2013-01-14 51 views
2

我正在使用計時器在每個時間間隔上安排一項作業。 似乎計時器已過去的事件被觸發不止一次。System.Timers.Timer在Windows服務中多次觸發已使用事件

下面一個代碼示例:

private static System.Timers.Timer _timer = new System.Timers.Timer(); 

protected override void OnStart(string[] args) 
{ 
     _timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent); 
     _timer.Interval = 1000; 
     _timer.Enabled = true; 
     _timer.Start(); 
} 

private void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e) 
{ 
     _timer.Enabled = false; 
     _timer.Stop(); 

     //Do the job 

     _timer.Enabled = true; 
     _timer.Start(); 
} 

你能幫助我嗎? 謝謝

+0

您不需要同時調用已啓用和開始 - 從MSDN:'開始() - 通過將啓用設置爲true來開始引發Elapsed事件*' – Blachshma

+0

這是您代碼中的錯誤。不止一次啓動該服務,您將爲其添加另一個事件處理程序。 –

回答

0

提高消逝事件的信號總是排隊等待上一個線程池線程執行 ,所以事件處理方法可能會在同一時間上一個 線程運行到停止方法的調用在另一個 線程上運行。這可能會導致在調用 Stop方法後引發Elapsed事件。下一節中的代碼示例顯示瞭解決此競爭情況的一種 方法。

引用自:Timer.Stop Method。請參閱頁面上的代碼示例。

+0

謝謝,我明白了。我將Timer.AutoReset屬性設置爲false,並刪除Timer.Stop(),現在工作正常。 –