首页 > 学院 > 开发设计 > 正文

Forms.Timer、Timers.Timer、Threading.Timer的研究

2019-11-17 02:48:51
字体:
来源:转载
供稿:网友
Forms.Timer、Timers.Timer、Threading.Timer的研究

.NET Framework里面提供了三种Timer

System.Windows.Forms.Timer

System.Timers.Timer

System.Threading.Timer

一、System.Windows.Forms.Timer

1、基于Windows消息循环,用事件方式触发,在界面线程执行;是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事件上的EvnetHandler。在这种Timer的EventHandler中可 以直接获取和修改UI元素而不会出现问题--因为这种Timer实际上就是在UI线程自身上进行调用的。

2、它是一个基于Form的计时器3、创建之后,你可以使用Interval设置Tick之间的跨度,用委托(delegate)hook Tick事件4、调用Start和Stop方法,开始和停止5、完全基于UI线程,因此部分UI相关的操作会在这个计时器内进行6、长时间的UI操作可能导致部分Tick丢失

例如

C# 代码 复制
public partial class Form1 : Form 
{ public Form1() { InitializeComponent(); } int num = 0; PRivate void Form_Timer_Tick(object sender, EventArgs e) { label1.Text = (++num).ToString(); Thread.Sleep(3000); } private void button1_Click(object sender, EventArgs e) { Form_Timer.Start(); } private void button2_Click(object sender, EventArgs e) { Form_Timer.Stop(); } } 

实例解析

1、上面这个是一个很简单的功能,在Form窗体上拖了一个System.Windows.Forms.Timer控件名字为Form_Timer,在属性窗中把Enable属性设置为Ture,Interval是定时器的间隔时间。双击这个控件就可以看到 Form_Timer_Tick方法。在这个方法中,我们让她不停的加一个数字并显示在窗体上,2个按钮提供了对计时器的控制功能。2、执行的时候你去点击其他窗体在回来,你会发现我们的窗体失去响应了。因为我们这里使用Thread.Sleep(3000);让当前线程挂起,而UI失去相应,说明了这里执行时候采用的是单线程。也就是执行定时器的线程就是UI线程。3、Timer 用于以用户定义的事件间隔触发事件。Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。4、在Timer内部定义的了一个Tick事件,我们前面双击这个控件时实际是增加了一行代码this.Form_Timer.Tick += new System.EventHandler(this.Form_Timer_Tick);

然后Windows将这个定时器与调用线程关联(UI线程)。当定时器触发时,Windows把一个定时器消息插入到线程消息队列中。调用线程执行一个消息泵提取消息,然后发送到回调方法中(这里的Form_Timer_Tick方法)。而这些都是单线程进行了,所以在执行回调方法时UI会假死。所以使用这个控件不宜执行计算受限或IO受限的代码,因为这样容易导致界面假死,而应该使用多线程调用的Timer。另外要注意的是这个控件时间精度不高,精度限定为 55 毫秒。

二、System.Timers.Timer

1. 用的不是Tick事件,而是Elapsed事件2. 和System.Windows.Forms.Timer一样,用Start和Stop方法3. AutoReset属性决定计时器是不是要发起一次事件然后停止,还是进入开始/等待的循环。System.Windows.Forms.Timer没有这个属性4. 设置对于UI控件的同步对象(synchronizing object),对控件的UI线程发起事件

例如

C# 代码 复制
public partial class Form1 : Form 
{ public Form1() { InitializeComponent(); } int num = 0; DateTime time1 = new DateTime(); DateTime time2 = new DateTime(); //定义Timer System.Timers.Timer Timers_Timer = new System.Timers.Timer(); 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表