C各种定时器比较.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C各种定时器比较

C# 各种定时器比较 zz 1.单线程的定时器存在很多问题,定时器只是定时把消息WM_TIMER访到线程的消息队列里,但并不保证消息会立即被响应,如果碰巧系统比较忙,消息可能会在队列里放一段时间才被响应,这样会造成本来应该间隔一段时间发生的消息连续发生了。 2. 。NET FrameWork带来了新的解决方案 Server Timers System.Timers.Timer 基于服务器的计时器,位于工具箱的“组件”选项卡上 Thread Timers System.Threading.Timer 在编程时使用的线程计时器 Windows Timers System.Windows.Forms.Timer 基于 Windows 的标准计时器,工具箱的Windows 窗体选项卡上; 区别a Windows Timers 提供了和WinAPI一样的Timer 基于消息,仍然是单线程 其他两个是是基于线程池的Thread Pool【最大好处,产生的时间准确均匀】 区别b Server Timers 和 Thread Timers 的不同在于ServerTimers 是基于事件的,Thread Timers是基于回调函数 Thread Timer是一个轻量级的方便使用,但也要注意一些问题,由于是多线程定时器,就会出现如果一个Timer处理没有完成,到了时间下一个照样会发生,导致严重错误,对付重入问题,通常的办法是加锁,但对于Timer不能简单的这样处理。 使用Timer来处于的事情,要注意: 首先Timer处理里本来就不应该做太需要时间的事情,或者花费时间无法估计的事情,比同远方的服务器建立一个网络连接,这样的做法尽量避免 如果实在无法避免,那么要评估Timer处理超时是否经常发生,如果是很少出现,那么可以用lock(Object)的方法来防止重入 如果这种情况经常出现呢?那就要用另外的方法来防止重入了 我们可以设置一个标志,表示一个Timer处理正在执行,下一个Timer发生的时候发现上一个没有执行完就放弃执行 static int inTimer = 0; public static void threadTimerCallback(Object obj) { if ( inTiemr == 0 ) { inTimer = 1; Console.WriteLine(Time:{0}, \tThread ID:{1}, DateTime.Now, Thread.CurrentThread.GetHashCode()); Thread.Sleep(2000); inTimer = 0; } } 但是在多线程下给inTimer赋值不够安全,还好Interlocked.Exchange提供了一种轻量级的线程安全的给对象赋值的方法 static int inTimer = 0; public static void threadTimerCallback(Object obj) { if ( Interlocked.Exchange(ref inTimer, 1) == 0 ) { Console.WriteLine(Time:{0}, \tThread ID:{1}, DateTime.Now, Thread.CurrentThread.GetHashCode()); Thread.Sleep(250); Interlocked.Exchange(ref inTimer, 0); } } ====试验======================================================= 1.ThreadTimer = new System.Threading.Timer(new TimerCallBack(onTime),this,0,1000) [- 参数 -] a.回调方法, b.回调方法中使用信息的对象, c.表示在 callback 参数调用它的方法之前延迟的时间量。指定 -1 毫秒以防止启动计时器。指定零 (0) 以立即启动计时器。 d.在调用 callback 所引用的方法之间的时间间隔。指定 -1 毫秒可以禁用定期终止 2. BaseTimeHandler 自定义一个事件 void OnTime(Object State) { Control ctl = State as Form1; if ( ctl != null BaseTimeHandler != null) { if ( ctl.IsHandleCreated ) { DateTime dt = DateTime.Now; String DateString = dt.ToString(yyyy/MM/dd); Stri

文档评论(0)

kaiss + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档