实现"计时器"的最佳方法是什么?

Rob*_*ert 176 c# .net-4.0

可能重复:
如何向C#控制台应用程序添加计时器

实现计时器的最佳方法是什么?代码示例会很棒!对于这个问题,"最佳"被定义为最可靠(最少数次失火)和精确.如果我指定15秒的间隔,我希望每15秒调用一次目标方法,而不是每10到20秒调用一次.另一方面,我不需要纳秒精度.在这个例子中,该方法每14.51-15.49秒触发一次是可以接受的.

Dav*_*ych 309

使用该Timer课程.

https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx

public static void Main()
{
    System.Timers.Timer aTimer = new System.Timers.Timer();
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    aTimer.Interval = 5000;
    aTimer.Enabled = true;

    Console.WriteLine("Press \'q\' to quit the sample.");
    while(Console.Read() != 'q');
}

 // Specify what you want to happen when the Elapsed event is raised.
 private static void OnTimedEvent(object source, ElapsedEventArgs e)
 {
     Console.WriteLine("Hello World!");
 }
Run Code Online (Sandbox Code Playgroud)

Elapsed事件将被升高的毫秒每X量,由指定的Interval计时器对象上属性.它将调用Event Handler您指定的方法,在上面的示例中OnTimedEvent

  • 计时器是否在单独的线程上执行? (10认同)
  • @VaughanHilts,简短回答,是的.很长的答案,回顾[这个SO答案](http://stackoverflow.com/a/1436331/1630665),它解释了计时器经过的线程非常好. (10认同)
  • @kuhaku`OnTimedEvent`是在`Main`下面定义的方法.它不是一种框架方法. (4认同)
  • 默认情况下启用是`false`。启用“获取或设置一个值,该值指示计时器是否应引发 Elapsed 事件”。这意味着将其设置为 true 启动计时器,并且 `timer.Enabled = true;` 等效于调用 `timer.Start()`; (3认同)
  • 注意:如果不正确处理System.Timers.Timer,可能会导致内存泄漏,因为运行中的计时器可以使主机类保持“活动”状态,从而防止垃圾回收。一个好的经验法则是,如果您有任何使用这些计时器之一的类,则应实现IDisposable,并在其Dispose方法中显式设置计时器。或在上面的示例中,您可以在“ Console.Read”之后添加“ aTimer.Dispose()”(尽管可以接受的是,由于我们将在“ Main”的末尾执行此操作,因此在此特定设置上没有实质性的区别)例)。 (3认同)

Jig*_*ker 41

通过使用System.Windows.Forms.Timer课程,您可以实现您的需求.

System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();


t.Interval = 15000; // specify interval time as you want
t.Tick += new EventHandler(timer_Tick);
t.Start();

void timer_Tick(object sender, EventArgs e)
{
      //Call method
}
Run Code Online (Sandbox Code Playgroud)

通过使用stop()方法,您可以停止计时器.

t.Stop();
Run Code Online (Sandbox Code Playgroud)


Tig*_*ran 26

目前尚不清楚您要开发的应用程序类型(桌面,Web,控制台......)

一般的答案,如果你正在开发Windows.Forms应用程序,是使用

System.Windows.Forms.Timer类.这样做的好处是它可以在UI线程上运行,所以只需定义它,订阅它的Tick事件并每15秒运行一次代码就很简单了.

如果你做了其他的事情,那么windows形式(问题不清楚),你可以选择System.Timers.Timer,但是这个其他线程上运行,所以如果你要对其Elapsed事件中的一些UI元素进行操作,你必须通过"调用"访问来管理它.