实现计时器的最佳方法是什么?一个代码示例会很棒!对于这个问题,“最佳”被定义为最可靠(最少的失火)和精确。如果我指定 15 秒的间隔,我希望每 15 秒调用一次目标方法,而不是每 10 到 20 秒。另一方面,我不需要纳秒精度。在此示例中,该方法每 14.51 - 15.49 秒触发一次是可以接受的。
4 回答
使用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 毫秒引发一次,由Interval
Timer 对象的属性指定。它将调用Event Handler
您指定的方法。在上面的例子中,它是OnTimedEvent
。
通过使用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();
目前尚不清楚您要开发哪种类型的应用程序(桌面、Web、控制台...)
如果您正在开发Windows.Forms
应用程序,一般的答案是使用
System.Windows.Forms.Timer类。这样做的好处是它在UI
线程上运行,所以很简单,只需定义它,订阅它的Tick事件并每 15 秒运行一次你的代码。
如果您执行其他操作然后窗口形式(从问题中不清楚),您可以选择System.Timers.Timer,但是这个在其他线程上运行,所以如果您要从其Elapsed事件中对某些 UI 元素采取行动,您必须通过“调用”访问来管理它。
参考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));
}