zoukankan      html  css  js  c++  java
  • [Scheduled Timer]第六回:定时器作业(TimerJob)

    1.引言

    实际应用中,我们是定义一个作业,定时器然后定时去调用。前面章节都介绍的时间调度、事件过滤(EventFilter)任务方法(MethodCall) 这些都是这个作业零部件,这就是这节要介绍的Job。

    2.Job

    Scheduled Timer的Job是由时间调度器、任务方法,事件过滤器等组成,共同来达到预期的目的,单个不行,好像一个团队,主要代码如下

        /// <summary>
        /// 定时器作业
        /// </summary>
        public class TimerJob
        {
            public IScheduledItem Schedule;
            //是否同步
            public bool SyncronizedEvent = true;
            public IResultFilter Filter;
            public IMethodCall Method;
            //public IJobLog Log;
            public bool Enabled = true;
    
            private delegate void ExecuteHandler(object sender, DateTime EventTime, ExceptionEventHandler Error);
            private ExecuteHandler _ExecuteHandler;
    
            public TimerJob(IScheduledItem schedule, IMethodCall method)
            {
                Schedule = schedule;
                Method = method;
                _ExecuteHandler = new ExecuteHandler(ExecuteInternal);
            }
    
            public DateTime NextRunTime(DateTime time, bool includeStartTime)
            {
                if (!Enabled)
                    return DateTime.MaxValue;
                return Schedule.NextRunTime(time, includeStartTime);
            }
    
            public void Execute(object sender, DateTime begin, DateTime end, ExceptionEventHandler error)
            {
                if (!Enabled)
                    return;
    
                List<DateTime> eventList = new List<DateTime>();
                Schedule.AddEventsInInterval(begin, end, eventList);
    
                if (Filter != null)
                    Filter.FilterResultsInInterval(begin, end, eventList);
    
                foreach (DateTime eventTime in eventList)
                {
                    if (SyncronizedEvent)
                        _ExecuteHandler(sender, eventTime, error);
                    else
                        _ExecuteHandler.BeginInvoke(sender, eventTime, error, null, null);
                }
            }
    
            private void ExecuteInternal(object sender, DateTime eventTime, ExceptionEventHandler error)
            {
                try
                {
                    TimerParameterSetter setter = new TimerParameterSetter(eventTime, sender);
                    Method.Execute(setter);
                }
                catch (Exception ex)
                {
                    if (error != null)
                        try { error(this, new ExceptionEventArgs(eventTime, ex)); }
                        catch { }
                }
            }
        }

    TimerJob的大致工作流程是,首先初始化时间调度器、任务方法、事件过滤器,再在执行作业时,先获取这个时间调度的时间集合,再进行事件过滤,再在有效的事件集合里循环执行任务方法。Scheduled Timer中一个定时器Timer不是只对应一个Job,而是一个Job集合中,Scheduled Timer的Job集合,代码很简单,对一个集合的操作,声明如下

        /// <summary>
        /// 计时器作业管理组
        /// </summary>
        public class TimerJobList
        {
            private List<TimerJob> _List;
    
            public TimerJobList()
            {
                _List = new List<TimerJob>();
            }
    
            public void Add(TimerJob Event)
            {
                _List.Add(Event);
            }
    
            public void Clear()
            {
                _List.Clear();
            }
    
            public DateTime NextRunTime(DateTime time)
            {
                DateTime next = DateTime.MaxValue;
                //从列表中,获得最低的日期时间。
                foreach (TimerJob Job in _List)
                {
                    DateTime Proposed = Job.NextRunTime(time, true);
                    next = (Proposed < next) ? Proposed : next;
                }
                return next;
            }
    
            public TimerJob[] Jobs
            {
                get { return _List.ToArray(); }
            }
        }

    3.总结

    作业比较简单,就是把之前的章节进行组合,主要看Job执行方法Execute,这也是定时器Timer的公共事件Elapsed事件将要调用的方法。

  • 相关阅读:
    数据结构化与保存
    使用正则表达式,取得点击次数,函数抽离
    爬取校园新闻首页的新闻
    网络爬虫基础练习
    词频统计
    试题----编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个
    试题---求出现重现次数最多的字母,如有多个重复的则都求出来
    试题----为什么Java的string类要设成immutable(不可变的)
    面试题---题目
    复制文件夹中所有内容到指定位置
  • 原文地址:https://www.cnblogs.com/qqlin/p/2694110.html
Copyright © 2011-2022 走看看