当系统处于睡眠状态时,Windows服务中的计时器如何表现?

Noc*_*tis 12 c# windows-services timer

假设我有一个Windows服务,它有一个定时器设置为每6小时运行一次,我希望它每天发射4次.比方说:0000,0600,1200 1800.(军事时间,00:00等)

如果系统在1000点睡觉,在1700点唤醒,会发生什么?

  1. 它会在1900年重新开火,因为它有两个小时的计时器吗?
  2. 它是否会立即开火(因为它错过了1200预约),然后再次在2300开火(将其加入当前时间6小时?)

我注意到,当计算机进入睡眠状态时,它不会触发OnPauseOnContinue方法.

如果有人能够在上述案例中阐明系统的行为,那将是非常有用的.
干杯,并提前感谢.

Noc*_*tis 0

为了满足我的需求,我最终使用了一个 Windows 服务,该服务将检查是否以及何时需要进行下一个操作,并简单地将计时器设置为该时间。
Windows 服务将在从睡眠状态恢复时更新该时间。

好处是:

  • 不受睡眠/醒来时间的影响
  • 调度程序没有运行任何控制台应用程序。
  • 使用NLog此处为快速教程)和Growl (此处为如何将 Growl 与 NLog 教程结合使用)在桌面上接收通知
  • 也有系统登录

由于我的情况很简单,该功能已经在一个单独的 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

因此,显然计算机知道它错过了一个刻度,它会触发该方法一次,然后从那里继续。请注意,它只会触发一次。

但如果知道幕后发生的事情的人能够进一步阐明这一点,我会很高兴。