c# 各种定时器比较

c# 各种定时器比较

ID:13442456

大小:35.00 KB

页数:0页

时间:2018-07-22

c# 各种定时器比较_第页
预览图正在加载中,预计需要20秒,请耐心等待
资源描述:

《c# 各种定时器比较》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、C#各种定时器比较zz1.单线程的定时器存在很多问题,定时器只是定时把消息WM_TIMER访到线程的消息队列里,但并不保证消息会立即被响应,如果碰巧系统比较忙,消息可能会在队列里放一段时间才被响应,这样会造成本来应该间隔一段时间发生的消息连续发生了。2.。NETFrameWork带来了新的解决方案ServerTimersSystem.Timers.Timer基于服务器的计时器,位于"工具箱"的“组件”选项卡上ThreadTimersSystem.Threading.Timer在编程时使用的线程计时器WindowsTimersSystem.Windows.

2、Forms.Timer基于Windows的标准计时器,"工具箱"的"Windows窗体"选项卡上;·区别aWindowsTimers提供了和WinAPI一样的Timer基于消息,仍然是单线程其他两个是是基于线程池的ThreadPool【最大好处,产生的时间准确均匀】·区别bServerTimers和ThreadTimers的不同在于ServerTimers是基于事件的,ThreadTimers是基于回调函数ThreadTimer是一个轻量级的方便使用,但也要注意一些问题,由于是多线程定时器,就会出现如果一个Timer处理没有完成,到了时间下一个照样会发生

3、,导致严重错误,对付重入问题,通常的办法是加锁,但对于Timer不能简单的这样处理。使用Timer来处于的事情,要注意:首先Timer处理里本来就不应该做太需要时间的事情,或者花费时间无法估计的事情,比同远方的服务器建立一个网络连接,这样的做法尽量避免如果实在无法避免,那么要评估Timer处理超时是否经常发生,如果是很少出现,那么可以用lock(Object)的方法来防止重入如果这种情况经常出现呢?那就要用另外的方法来防止重入了我们可以设置一个标志,表示一个Timer处理正在执行,下一个Timer发生的时候发现上一个没有执行完就放弃执行staticint

4、inTimer=0;publicstaticvoidthreadTimerCallback(Objectobj){if(inTiemr==0){inTimer=1;Console.WriteLine("Time:{0},tThreadID:{1}",DateTime.Now,Thread.CurrentThread.GetHashCode());Thread.Sleep(2000);inTimer=0;}}但是在多线程下给inTimer赋值不够安全,还好Interlocked.Exchange提供了一种轻量级的线程安全的给对象赋值的方法staticin

5、tinTimer=0;publicstaticvoidthreadTimerCallback(Objectobj){if(Interlocked.Exchange(refinTimer,1)==0){Console.WriteLine("Time:{0},tThreadID:{1}",DateTime.Now,Thread.CurrentThread.GetHashCode());Thread.Sleep(250);Interlocked.Exchange(refinTimer,0);}}====试验==========================

6、=============================1.ThreadTimer=newSystem.Threading.Timer(newTimerCallBack(onTime),this,0,1000)[-参数-]a.回调方法,b.回调方法中使用信息的对象,c.表示在callback参数调用它的方法之前延迟的时间量。指定-1毫秒以防止启动计时器。指定零(0)以立即启动计时器。d.在调用callback所引用的方法之间的时间间隔。指定-1毫秒可以禁用定期终止2.BaseTimeHandler自定义一个事件voidOnTime(ObjectStat

7、e){Controlctl=StateasForm1;if(ctl!=null&&BaseTimeHandler!=null){if(ctl.IsHandleCreated){DateTimedt=DateTime.Now;StringDateString=dt.ToString("yyyy/MM/dd");StringTimeString=dt.ToString("HH:mm:ss");string[]args=newstring[]{DateString,TimeString};try{//如果在不同线程中if(ctl.InvokeRequired)

8、ctl.Invoke(BaseTimeHandler,args);elseBas

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。