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://HdhCmsTestcnblogs测试数据/qqlin/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类: Scheduled Timer
标签: timer
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did47954