2013-04-09 60 views
0

如果Execute()需要比如說3000ms完成,但由於定時器間隔每1000ms調用一次,下面的代碼會發生什麼情況?定時器間隔調用長方法

 Timer _timer = new Timer();   
     private void setupTimer() 
     { 
      _timer.Tick += new EventHandler(pollingTimeElapsed); 
      _timer.Interval = 1000; 
      _timer.Enabled = true; 
      _timer.Start(); 
     } 

     private void pollingTimeElapsed(object sender, EventArgs e) 
     { 
      Execute(); 
     } 

編輯:我使用System.Windows.Forms.Timer,因爲System.Timers.Timer沒有.Tick

+0

您是否使用System.Timers.Timer或System.Windows.Forms.Timer? – Maarten 2013-04-09 07:19:09

+0

不要懷疑會發生什麼!只需停止計時器,執行()並再次啓動計時器。 – 2013-04-09 07:20:40

+0

System.Windows.Timer有一個Tick事件,System.Timers.Timer有一個Elapsed事件。 System.Timers.Timer有我的偏好。 – Maarten 2013-04-09 07:23:43

回答

1

我假設你正在使用的System.Timers.Timer類。

由於AutoReset具有默認值(這是True),因此每經過1000ms就會觸發Elapsed事件。

如果您只想觸發一次事件,請將AutoReset設置爲False。

如果你不想火,而你的執行代碼正在運行的情況下,執行以下操作:

Timer _timer = new Timer();   
private void setupTimer() { 
    _timer.Tick += new EventHandler(pollingTimeElapsed); 
    _timer.Interval = 1000; 
    _timer.Enabled = true; 
    _timer.Start(); 
} 

private void pollingTimeElapsed(object sender, EventArgs e) { 
    try { 
     _timer.Stop() 
     Execute(); 
    } finally { 
     _timer.Start() 
    } 
} 
+0

_timer.Enabled = true;和_timer.Start();是多餘的。 – JohnSaps 2014-05-29 08:03:12

+0

在經過的事件中停止計時器時可能存在爭用問題。 – JohnSaps 2014-05-29 08:03:57