Noc*_*tis 12 c# windows-services timer
假设我有一个Windows服务,它有一个定时器设置为每6小时运行一次,我希望它每天发射4次.比方说:0000,0600,1200 1800.(军事时间,00:00等)
如果系统在1000点睡觉,在1700点唤醒,会发生什么?
我注意到,当计算机进入睡眠状态时,它不会触发OnPause或OnContinue方法.
如果有人能够在上述案例中阐明系统的行为,那将是非常有用的.
干杯,并提前感谢.
为了满足我的需求,我最终使用了一个 Windows 服务,该服务将检查是否以及何时需要进行下一个操作,并简单地将计时器设置为该时间。
Windows 服务将在从睡眠状态恢复时更新该时间。
好处是:
由于我的情况很简单,该功能已经在一个单独的 dll 中,因此我没有任何稳定性或内存泄漏问题(如果我这样做,我会感到羞耻)。这使得我需要的事情每天发生一次,或者每次计算机唤醒时发生一次,并且不会在系统上产生额外的开销。
正如Henrik回复并链接的那样,正确答案是 2。
我在 linqpad 中编写了以下内容,与上面答案中的链接类似:
static int counter = 0;
static System.Timers.Timer my_timer;
void Main()
{
// Set up a timer to trigger every minute.
my_timer = new System.Timers.Timer();
DateTime now = DateTime.Now;
my_timer.Interval = (60 - now.Second) * 1000; // Fire at beginning of minute
string.Format("First tick in {0} seconds", my_timer.Interval/1000).Dump();
my_timer.Elapsed += OnTimer;
my_timer.Start();
while (counter < 5) { // sleep away until 5 ticks happen
Thread.Sleep(5000);
}
// stop timer and say goodbye
my_timer.Stop();
DateTime.Now.Dump("Finished running, shutting down");
}
// Print time and counter every timer tick
void OnTimer(object sender, System.Timers.ElapsedEventArgs args)
{
if (my_timer.Interval != 60000) // set to one minute after first time
my_timer.Interval = 60000;
DateTime.Now.ToString("HH:mm:ss.fff").Dump("On Timer fired:");
(counter++).Dump("Static counter :");
}
Run Code Online (Sandbox Code Playgroud)
得到结果:
第一次计时:37 秒
启动定时器:08:47:00.552
静态计数器:0启动定时器:08:48:00.557
静态计数器:1启动定时器:08:49:00.571
静态计数器:2// 在 08:49:30 将计算机关闭 3 分钟
启动定时器:08:52:33.509
静态计数器:3启动定时器:08:53:33.510
静态计数器:4运行完毕,关闭 1/09/2014 8:53:38 AM
因此,显然计算机知道它错过了一个刻度,它会触发该方法一次,然后从那里继续。请注意,它只会触发一次。
但如果知道幕后发生的事情的人能够进一步阐明这一点,我会很高兴。