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

时间:2012-09-21 17:58:26

标签: c# .net-4.0

  

可能重复:
  How do you add a timer to a C# console application

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

4 个答案:

答案 0 :(得分:276)

使用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!");
 }

Elapsed事件将每隔X毫秒启动一次,由Timer对象上的Interval属性指定。它将调用您指定的Event Handler方法,在上面的示例中为OnTimedEvent

答案 1 :(得分:35)

通过使用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
}

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

t.Stop();

答案 2 :(得分:23)

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

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

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

如果您执行其他操作,那么Windows表单(问题中不明确),您可以选择System.Timers.Timer,但运行在其他主题上,因此,如果您要对其Elapsed事件中的某些UI元素进行操作,则必须通过“调用”访问来管理它。

答案 3 :(得分:2)

ServiceBase引用到您的班级,并将以下代码放入OnStart事件中:

Constants.TimeIntervalValue = 1(小时)..理想情况下,您应该在配置文件中设置此值。

StartSendingMails =您要在应用程序中运行的函数名称。

 protected override void OnStart(string[] args)
        {
            // It tells in what interval the service will run each time.
            Int32 timeInterval = Int32.Parse(Constants.TimeIntervalValue) * 60 * 60 * 1000;
            base.OnStart(args);
            TimerCallback timerDelegate = new TimerCallback(StartSendingMails);
            serviceTimer = new Timer(timerDelegate, null, 0, Convert.ToInt32(timeInterval));
        }