ScheduleTimer
1.引言
Scheduled Timer将定时器Timer进行封装成ScheduledTimer,很多Timer暴露的成员,都以私有化,并将上一节中的 定时器作业(TimerJob) 进行了集成。
2.ScheduledTimer代码很简单,直接上代码
public class ScheduleTimer { public IEventStorage EventStorage = new LocalEventStorage(); public event ExceptionEventHandler Error; private static TimeSpan MAX_INTERVAL = new TimeSpan( 0 , 1 , 0 ); private DateTime _LastTime; private Timer _Timer; private TimerJobList _Jobs; private volatile bool _StopFlag; public ScheduleTimerBase() { _Timer = new Timer(); _Timer.AutoReset = false ; _Timer.Elapsed += new ElapsedEventHandler(Timer_Elapsed); _Jobs = new TimerJobList(); _LastTime = DateTime.MaxValue; } public void AddJob(IScheduledItem schedule, Delegate f, params object [] Params) { _Jobs.Add( new TimerJob(schedule, new DelegateMethodCall(f, Params))); } public void AddAsyncJob(IScheduledItem schedule, Delegate f, params object [] Params) { TimerJob Event = new TimerJob(schedule, new DelegateMethodCall(f, Params)); Event.SyncronizedEvent = false ; _Jobs.Add(Event); } public void AddJob(TimerJob Event) { _Jobs.Add(Event); } public void ClearJobs() { _Jobs.Clear(); } public void Start() { _StopFlag = false ; QueueNextTime(EventStorage.ReadLastTime()); } public void Stop() { _StopFlag = true ; _Timer.Stop(); } public void Dispose() { if (_Timer != null ) _Timer.Dispose(); } private double NextInterval(DateTime thisTime) { TimeSpan interval = _Jobs.NextRunTime(thisTime) - thisTime; if (interval > MAX_INTERVAL) interval = MAX_INTERVAL; return (interval.TotalMilliseconds == 0 ) ? 1 : interval.TotalMilliseconds; } private void QueueNextTime(DateTime thisTime) { _Timer.Interval = NextInterval(thisTime); System.Diagnostics.Debug.WriteLine(_Timer.Interval); _LastTime = thisTime; EventStorage.RecordLastTime(thisTime); _Timer.Start(); } private void Timer_Elapsed( object sender, ElapsedEventArgs e) { try { if (_Jobs == null ) return ; _Timer.Stop(); foreach (TimerJob Event in _Jobs.Jobs) { try { Event.Execute( this , _LastTime, e.SignalTime, Error); } catch (Exception ex) { OnError(DateTime.Now, Event, ex); } } } catch (Exception ex) { OnError(DateTime.Now, null , ex); } finally { if (_StopFlag == false ) QueueNextTime(e.SignalTime); } } private void OnError(DateTime eventTime, TimerJob job, Exception e) { if (Error == null ) return ; try { Error( this , new ExceptionEventArgs(eventTime, e)); } catch (Exception) { } } }
暴露出的成员很简单,有事件存储、异常事件、启动、停止、添加作业、清空作业。
简单介绍一下流程:
声明一个ScheduleTimer 添加一个作业 启动定时器Start方法,EventStorage.ReadLastTime() 读取事件持久化时间,设置间隔时间 执行Timer的Elapsed事件,执行Job,记录 EventStorage各个成员具体执行,请看之前的各个章节介绍。
3.总结Scheduled Timer基本介绍了,还有一些 异常事件、回调事件没有介绍,都很简单,下面一个章节,将会进行总结一下。
作者: Qlin
出处: http://www.cnblogs.com/qqlin/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类: Scheduled Timer
标签: timer
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did47954