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

问题描述 投票:0回答:4

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

c# .net-4.0
4个回答
414
投票

使用

Timer
课程。

public static void Main()
{
    System.Timers.Timer aTimer = new System.Timers.Timer();
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    aTimer.Interval = 5000; // ~ 5 seconds
    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


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();

35
投票

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

如果您正在开发

Windows.Forms
应用程序,一般答案是使用

System.Windows.Forms.Timer类。这样做的好处是它在

UI
线程上运行,因此很简单,只需定义它,订阅其 Tick 事件并每 15 秒运行一次代码。

如果你做其他事情然后Windows窗体(从问题中不清楚),你可以选择System.Timers.Timer,但是this一个在other线程上运行,所以如果你要对某些操作进行操作来自其 Elapsed 事件的 UI 元素,您必须通过“调用”访问来管理它。


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));
        }
© www.soinside.com 2019 - 2024. All rights reserved.