posts - 7,comments - 5,views - 18190

最近做个windows 服务,功能是:定时执行一个任务:自动登录到一个网站后,点击相关网面上的按钮button。

在处理的过程中发现定时器老是不定时的失效,失效时间没有规律。

由于刚开始处于测试阶段,所以只简单的log一下到时间间隔后是否执行了定时器定时Elapsed事件;结果出错了,每大约相隔几个小时就没有log记录了,是怎么回事呢?

为什么运行一段时间后(一般几个小时到十几个小时)定时器就不工作了,过了一段时间后又会自动工作了。

也就是说   log.Info("Do something on time:"+DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")); 这段代码有时候没有把当前时间写到log文件里,过段时间又能自动写入了。

测试程序比较简单,如下:

 public partial class MyService : ServiceBase
    {
        #region private methods and fields;
        log4net.ILog log = log4net.LogManager.GetLogger("logger");
        System.Timers.Timer timer = new System.Timers.Timer(1000);
 
        protected void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
                    timer.Enabled = false;
                    log.Info("Do something on time:"+DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
                    timer.Enabled = true;
        }

        public AutoOpenListService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            //set timer working.
            if (timer != null)
            {
                timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed);
                timer.Enabled = true;
                timer.AutoReset = true;
            }
        }

        protected override void OnStop()
        {
            if (timer != null)
            {
                timer.Elapsed -= new System.Timers.ElapsedEventHandler(Timer_Elapsed);
                timer.Enabled = false;
            }
        }

}
}

经过测试,这个困扰我很长时间的问题,原来就是电脑处于睡眠或者休眠的状态了,使得定时器失效。
一般公司电脑会默认一段时间后电脑处于休眠或睡眠状态。手动改为从不休眠或睡眠就行了。问题就解决了。

顺便补充一下:待机、休眠、睡眠 区别
1: 电脑待机待机(Standby):将系统切换到该模式后,除了内存,电脑其他设备的供电都将中断,只有内存依靠电力维持着其中的数据(因为内存是易失性 的,只要断电,数据就没有了)。这样当希望恢复的时候,就可以直接恢复到待机前状态。这种模式并非完全不耗电,因此如果在待机状态下供电发生异常(例如停 电),那么下一次就只能重新开机,所以待机前未保存的数据都会丢失。但这种模式的恢复速度是最快的,一般五秒之内就可以恢复。

2:电脑休 眠(Hibernate):将系统切换到该模式后,系统会自动将内存中的数据全部转存到硬盘上一个休眠文件中,然后切断对所有设备的供电。这样当恢复的时 候,系统会从硬盘上将休眠文件的内容直接读入内存,并恢复到休眠之前的状态。这种模式完全不耗电,因此不怕休眠后供电异常,但代价是需要一块和物理内存一 样大小的硬盘空间(好在现在的硬盘已经跨越TB级别了,大容量硬盘越来越便宜)。而这种模式的恢复速度较慢,取决于内存大小和硬盘速度,一般都要1分钟左 右,甚至更久。

3:电脑睡眠(Sleep):电脑睡眠是Windows Vista中的新模式,这种模式结合了待机和休眠的所有优点。将系统切换到睡眠状态后,系统会将内存中的数据全部转存到硬盘上的休眠文件中(这一点类似休 眠),然后关闭除了内存外所有设备的供电,让内存中的数据依然维持着(这一点类似待机)。这样,当我们想要恢复的时候,如果在睡眠过程中供电没有发生过异 常,就可以直接从内存中的数据恢复(类似待机),速度很快;但如果睡眠过程中供电异常,内存中的数据已经丢失了,还可以从硬盘上恢复(类似休眠),只是速 度会慢一点。不过无论如何,这种模式都不会导致数据丢失。

 

此处log一下,以防以后忘记!

如果此文对你有帮助

 

posted on   Albert Fei  阅读(4812)  评论(4编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示