2013-04-09 74 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

相关问题