Timer定时器的设计方法-基础电子_第1页
Timer定时器的设计方法-基础电子_第2页
Timer定时器的设计方法-基础电子_第3页
Timer定时器的设计方法-基础电子_第4页
Timer定时器的设计方法-基础电子_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精品文档-下载后可编辑Timer定时器的设计方法-基础电子在系统开发过程中经常用到定时器进行定时处理,比如比较常见的邮件群发、实时更新论坛的在线人数、文章数、点击率等。很多情况下,我们不能对某一状态或者某一行为进行实时监控,所以就希望系统能够实现这一功能。通过多线程技术可以使得定时器的性能更高。尽管定时器能够自动处理或者一些批处理操作,但是定时器也给系统带来一定的安全隐患,特别是当定时进行的操作出现bug时,如果没有对Exception做出及时的处理,系统资源将会大大的浪费,严重的情况下,可能导致系统崩溃。因此,对于定时器的使用一定要慎重,至少要保证定时处理的行为出现异常的可能性很小,并在出现Exception的情况下及时处理。System.Threading.Timer是一个非常常用的定时器类,是一个使用回调方法的计时器,而且由线程池线程服务,简单且对资源要求不高。publicTimer(TimerCallbackcallback,Objectstate,TimeSpandueTime,TimeSpanperiod)参数callback一个TimerCallback委托,表示要执行的方法。state一个包含回调方法要使用的信息的对象,或者为空引用(在VisualBasic中为Nothing)。dueTimeTimeSpan,表示在callback参数调用它的方法之前延迟的时间量。指定-1毫秒以防止启动计时器。指定零(0)以立即启动计时器。period在调用callback所引用的方法之间的时间间隔。指定-1毫秒可以禁用定期终止。方法、原理使用TimerCallback委托指定希望Timer执行的方法。计时器委托在构造计时器时指定,并且不能更改。此方法不在创建计时器的线程上执行,而是在系统提供的ThreadPool线程上执行。创建计时器时,可以指定在次执行方法之前等待的时间量(截止时间)以及此后的执行期间等待的时间量(时间周期)。可以使用Change方法更改这些值或禁用计时器。当不再需要计时器时,请使用Dispose方法释放计时器持有的资源。如果希望在计时器被释放时接收到信号,请使用接受WaitHandle的Dispose(WaitHandle)方法重载。计时器已被释放后,WaitHandle便终止。由计时器执行的回调方法应该是可重入的,因为它是在ThreadPool线程上调用的。备注:在超过dueTime以后及此后每隔period时间间隔,都会调用callback参数所指定的委托。如果dueTime为零(0),则立即调用callback。如果dueTime是-1毫秒,则不会调用callback;计时器将被禁用,但通过调用Change方法可以重新启用计时器。如果period为零(0)或-1毫秒,而且dueTime为正,则只会调用callback;计时器的定期行为将被禁用,但通过使用Change方法可以重新启用该行为。简单的定时器usingSystem;usingSystem.Threading;publicclassTestTimer{/**////summary///定时器////summaryprivateTimeriTimer;/**////summary///constructor////summarypublicTestTimer(){iTimer=newSystem.Threading.Timer(newTimerCallback(Doing));iTimer.Change(TimeSpan.FromMinutes(5),TimeSpan.FromMinutes(5));}/**////summary///////summary///paramname="nObject"/parampublicvoidDoing(objectnObject){//dosomething}}一个比较完整的计时器:下面是我设计的一个简单实例。在一个问卷调查系统中,每一张问卷都有其终止日期,当到达了终止日期时,需要系统自动将其关闭。这就需要定时器对问卷的状态和终止日期进行实时监控,及时关闭。这里采用了一个简单的单件模式来操作、控制定时器。这里主要的操作包括定时器开始、终止、执行。PaperManager管理类/**////summary///管理类////summarypublicclassPaperManager{/**////summary///定时器////summaryprivateTimeriTimer;/**////summary///启动时间////summaryprivateTimeSpandueTime;/**////summary///方法调用间隔////summaryprivateTimeSpanperiod;/**////summary///委托////summaryprivateTimerCallbacktimerDelegate;/**////summary///静态实例////summaryprivatestaticreadonlyPaperManagerself=newPaperManager();/**////summary///构造函数////summarypublicPaperManager(){timerDelegate=newTimerCallback(CheckStatus);}/**////summary///////summary///returns/returnspublicstaticPaperManagergetInstance(){returnself;}/**////summary///设置启动时间间隔////summary///paramname="days"天/param///paramname="hours"小时/param///paramname="minutes"分钟/param///paramname="seconds"秒/param///paramname="milisecond"毫秒/parampublicvoidsetDueTime(intdays,inthours,intminutes,intseconds,intmilisecond){dueTime=newTimeSpan(days,hours,minutes,seconds,milisecond);}/**////summary///设置回调时间间隔

////summary///paramname="days"天/param///paramname="hours"小时/param///paramname="minutes"分钟/param///paramname="seconds"秒/param///paramname="milisecond"毫秒/parampublicvoidsetPeriod(intdays,inthours,intminutes,intseconds,intmilisecond){period=newTimeSpan(days,hours,minutes,seconds,milisecond);}/**////summary///开始////summarypublicvoidStart(){AutoResetEventautoEvent=newAutoResetEvent(false);dueTime=TimeSpan.FromSeconds(0);period=TimeSpan.FromSeconds(10);iTimer=newTimer(timerDelegate,autoEvent,dueTime,period);autoEvent.WaitOne(5000,false);iTimer.Change(dueTime,period);}/**////summary///停止////summarypublicvoidStop(){iTimer.Dispose();}/**////summary///执行////summarypublicvoidExcuteOneTime(){if(iTimer!=null){iTimer.Dispose();}//如果period为零(0)或-1毫秒,而且dueTime为正,则只会调用callback;//计时器的定期行为将被禁用,但通过使用Change方法可以重新启用该行为。setDueTime(0,0,0,0,1);setPeriod(0,0,0,0,-1);AutoResetEventautoEvent=newAutoResetEvent(false);iTimer=newTimer(timerDelegate,autoEvent,dueTime,period);autoEvent.WaitOne(5000,false);iTimer.Change(dueTime,period);}/**////summary///行为////summary///paramname="nObject"/parampublicvoidCheckStatus(objectnObject){AutoResetEventautoEvent=(AutoResetEvent)nObject;if(ExcuteUpdate()){autoEvent.Set();}}/**////summary///更新////summary///returns/returnsprivateboolExcuteUpdate(){try{//应该从数据库获得Paper对象的集合,这里简略//ListPaperpaperList=getPaperList();ListPaperpaperList=newListPaper();foreach(PaperiteminpaperList){if(item.EndTime=DateTime.Now){if(item.Status==Paper.StatusOfNormal){item.Status=Paper.StatusOfTerminate;}}}/**/////执行数据更新,这里省略returntrue;}catch{returnfalse;}}}这是问卷的实体类,只是简单的列出必要的属性。Paper实体类/**////summary///实体类////summarypublicclassPaper{/**////summary///终止时间////summarypublicDateTimeEndTime;/**////summary///状态////summarypublicintStatus;/**////summary///正常////summarypublicconstintStatusOfNormal

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论