- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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 窗体选项卡上; 区别aWindows Timers 提供了和WinAPI一样的Timer 基于消息,仍然是单线程其他两个是是基于线程池的Thread Pool【最大好处,产生的时间准确均匀】
区别bServer 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
您可能关注的文档
最近下载
- 某实验室装修工程投标文件—技术标.docx VIP
- Unit 6 A Day in the Life 单元检测(含答案) 人教版(2024)英语七年级上册.docx VIP
- B级法兰锻制-作业指导书生产用设备操作与维护规程汇编.doc VIP
- T_ZJAF 13.1-2023 公共视频资源 第1部分:总则.docx VIP
- 第四课 用联系的观点看问题(精品课件)-【中职专用】高二思想政治《哲学与人生》同步精品课堂(高教版2023·基础模块).pptx VIP
- 2025年高考政治真题试卷(新课标卷)+解析及答案001.docx VIP
- 2022年职业教育国家级教学成果奖申报书.pdf VIP
- 《吸入装置使用》课件.pptx VIP
- 患者隐私保护与信息安全培训.pptx VIP
- IT运维管理制度流程图.pdf VIP
文档评论(0)