WINDOWS 8下,时间相关服务程序需要override OnPowerEvent事件
对于绝大多数人来说,win8的开机速度变快了。
在windows 8内部,这是由于使用了一些技术,使得关机过程类似于传统的休眠——将内存中的数据保存到硬盘,然后断电,而开机的时候,则只需要回复内存中的数据就可以了。
不过对于自己制造的服务程序来说,则需要考虑一些别的东西——实际上,这是所有与时间相关的,有良好设计的应用程序所应该具有的,但由于这个服务程序是自己用,在其他操作系统下一般不会选择挂起到磁盘(休眠)或挂起到内存(睡眠),因此从未考虑过该问题,即:从未捕获过OnPowerEvent事件。
这个服务是用来解决登录网络的麻烦的,让系统每次开机都自动登录网络——而网络在一段时间没有使用的情况下是会自动断开的。因此,但我查看日志发现开机没有启动这个服务的记录,而sc query显示该服务正在运行的时候,我有些惊讶。
经过测试,在windows 8重启的时候,会直接OnStart,但或许是没有装载dotnet运行环境,大约在onstart一分钟后,逻辑才执行结束。这个行为我将进一步分析。不过让我有些奇怪的是没有OnStop的记录。
(update:刚刚写了一些更为细致的log,发现onstart需要一分钟这个不是windows规定的行为,而是HttpWebRequest的GetRequestStream需要的时间太长。从14:34:56,097开始到14:35:47,823结束,尚不确定是什么原因,如果您明确,请您教诲)
而在关机的时候,OnPowerEvent事件将传入枚举参数Suspend(OnPowerEvent:Suspend)。开机的时候从磁盘恢复,ResumeSuspend被传入(OnPowerEvent:ResumeSuspend),紧接着,ResumeAutomatic被传入(OnPowerEvent:ResumeAutomatic)。
曾经我觉得该服务的Start_Pending时间过长,因此修改了服务的启动次序。但修改后,进入win8时需要等待约1min才能进入桌面,在此期间计算机停止响应但鼠标可以移动。因此还是不建议修改服务启动组的。