216

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

4

4 回答 4

374

使用Timer类。

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 毫秒引发一次,由IntervalTimer 对象的属性指定。它将调用Event Handler您指定的方法。在上面的例子中,它是OnTimedEvent

于 2012-09-21T17:59:22.890 回答
50

通过使用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();
于 2012-09-21T18:05:50.997 回答
32

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

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

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

如果您执行其他操作然后窗口形式(从问题中不清楚),您可以选择System.Timers.Timer,但是这个其他线程上运行,所以如果您要从其Elapsed事件中对某些 UI 元素采取行动,您必须通过“调用”访问来管理它。

于 2012-09-21T18:01:45.727 回答
3

参考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));
        }
于 2012-09-21T18:12:30.153 回答