2011-06-23 27 views
6

當程序啓動時,我的計時器'Elapsed'事件觸發兩次。 'Elapsed'事件處理程序的唯一賦值是'Main'方法。有什麼我做錯了嗎?在C#命令行程序中發生兩次定時器事件事件

//class level clock 
public static System.Timers.Timer Clock; 

static void Main(string[] args) 
    { 
     Clock = new System.Timers.Timer(); 
     Clock.Elapsed += new ElapsedEventHandler(Clock_Elapsed); 
     Clock.AutoReset = false; 
     Clock.Interval = timerInterval; //this needs to be in milliseconds! 
     Clock.Enabled = true; 

     //run infinite loop until q is pressed 
     while (Console.Read() != 'q') 
     {} 
    } 

static void Clock_Elapsed(object sender, ElapsedEventArgs e) 
    { 
    Clock.Stop(); 
    //do some stuff 
    Clock.Start();    
    } 

UPDATE:

自動復位由@ fparadis2提供固定擊發兩次。基本問題是我的計時器時間間隔設置爲30毫秒而不是30000毫秒(30秒),因此事件是雙重觸發。

+0

[timer fire twice]可能的重複(http://stackoverflow.com/questions/4309254/timer-fire-twice) – user7116

回答

13

如果timerInverval足夠小,在您有機會停止時鐘之前,可能會發生兩次Elapsed事件。你應該這樣做:

Clock.AutoReset = false; 

爲了每次啓動計時器只被通知一次。

正如documentation規定:

如果經過的事件處理持續時間超過時間間隔,該事件可能會再次在另一個線程池線程提高。在這種情況下,事件處理程序應該是可重入的。

+0

時鐘未定義? - 鏈接已損壞 –

2

您也可以考慮檢查這個pattern