[Scheduled Timer]第三回:事件存储(EventStorage)

本文探讨了如何使用EventStorage解决定时任务在网站重启后无法恢复执行的问题,详细介绍了EventStorage接口及其实现方式,包括内存持久化、文件持久化等,以及如何在ScheduledTimer中应用EventStorage进行事件的持久化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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接口即可。

转载于:https://www.cnblogs.com/qqlin/archive/2012/09/22/2688927.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值