zoukankan      html  css  js  c++  java
  • [Scheduled Timer]第三回:事件存储(EventStorage)

    1.引言

    上一节介绍了调度时间,不清楚的可以参考[Scheduled Timer]第二回,里面谈到了一个,定时器Timer阻塞,而导致定时器延时;或者是网站关停了几个小时,导致本该定时执行的活动没有执行,这都引出一个问题,就是上次执行的时间要记录下来,保存到数据库或者文件里,否则恢复不了,这就引出了EventStorage。

    2.EventStorage

    EventStorage是事件持久化,就是把Timer上次执行的时间保存下来,以便能够恢复执行,也就是可以用上节中讲到的IScheduledItem的AddEventsInInterval方法进行恢复。Scheduled Timer提供了一个IEventStorage接口,如下:

        /// <summary>
        ///事件存储(持久化)
        /// </summary>
        public interface IEventStorage
        {
            /// <summary>
            /// 记录最后一次时间
            /// </summary>
            /// <param name="Time"></param>
            void RecordLastTime(DateTime Time);
            /// <summary>
            /// 读取最后一次时间
            /// </summary>
            /// <returns></returns>
            DateTime ReadLastTime();
        }

    接口很简单,两个方法,一个是记录,一个是读取。

    • 什么时候读取,当Timer第一次启动时进行读取。
    • 为什么读取,读取上一次成功执行的时间,通过IScheduledItem的AddEventsInInterval方法可以把上次执行的时间到现在执行的时间所有的任务获取到。
    • 什么时候记录,每当Timer的Elapsed事件执行时,把ElapsedEventArgs.SignalTime的时间进行记录下来。

    下面看看Scheduled Timer其中的一个实现,文件存储:

     /// <summary>
        ///xml文件存储
        /// </summary>
        public class FileEventStorage : IEventStorage
        {
            string _FileName;
            string _XPath;
            XmlDocument _Doc = new XmlDocument();
    
            public FileEventStorage(string fileName, string xPath)
            {
                _FileName = fileName;
                _XPath = xPath;
            }
    
            public void RecordLastTime(DateTime time)
            {
                _Doc.SelectSingleNode(_XPath).Value = time.ToString();
                _Doc.Save(_FileName);
            }
    
            public DateTime ReadLastTime()
            {
                _Doc.Load(_FileName);
                string Value = _Doc.SelectSingleNode(_XPath).Value;
                if (Value == null || Value == string.Empty)
                    return DateTime.Now;
                return DateTime.Parse(Value);
            }
        }

    上面是保存到xml,这样的话,即便是网站重启,也可以读取xml文件保存的时间,进行恢复执行。

    3.总结

    Scheduled Timer提供了内存持久化,文件持久化,空持久化。其它像数据库持久化,都可以自己实现,默认是内存持久化。实现起来非常简单,实现IEventStorage接口即可。

  • 相关阅读:
    C语言I博客作业10
    C语言I博客作业09
    C语言I博客作业08
    背景图
    C语言II作业01
    C语言寒假大作战04
    C语言寒假大作战03
    C语言寒假大作战02
    C语言寒假大作战01
    C语言I博客作业12
  • 原文地址:https://www.cnblogs.com/qqlin/p/2688927.html
Copyright © 2011-2022 走看看