Csharp/C#教程:C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析分享

本文实例讲述了C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析,分享给大家供大家参考。具体分析如下:

在.NETFramework里面提供了三种Timer

①System.Windows.Forms.Timer

②System.Timers.Timer

③System.Threading.Timer

现分述如下:

一、System.Windows.Forms.Timer

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

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

例如

代码如下:publicpartialclassForm1:Form

{
publicForm1()
{
InitializeComponent();
}

intnum=0;

privatevoidForm_Timer_Tick(objectsender,EventArgse)
{
label1.Text=(++num).ToString();
Thread.Sleep(3000);
}

privatevoidbutton1_Click(objectsender,EventArgse)
{
Form_Timer.Start();
}

privatevoidbutton2_Click(objectsender,EventArgse)
{
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+=newSystem.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控件的同步对象(synchronizingobject),对控件的UI线程发起事件

例如

代码如下:publicpartialclassForm1:Form

{
publicForm1()
{
InitializeComponent();
}

intnum=0;
DateTimetime1=newDateTime();
DateTimetime2=newDateTime();
//定义Timer
System.Timers.TimerTimers_Timer=newSystem.Timers.Timer();

privatevoidbutton1_Click(objectsender,EventArgse)
{
//手动设置Timer,开始执行
Timers_Timer.Interval=20;
Timers_Timer.Enabled=true;
Timers_Timer.Elapsed+=newSystem.Timers.ElapsedEventHandler(Timers_Timer_Elapsed);
time1=DateTime.Now;
}

voidTimers_Timer_Elapsed(objectsender,System.Timers.ElapsedEventArgse)
{
label1.Text=Convert.ToString((++num));//显示到lable
Thread.Sleep(3000);
}

privatevoidbutton2_Click(objectsender,EventArgse)
{
//停止执行
Timers_Timer.Enabled=false;
time2=DateTime.Now;
MessageBox.Show(Convert.ToString(time2-time1));
}
}

三、System.Threading.Timer

代码如下:publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
}

intnum=0;
DateTimetime1=newDateTime();
DateTimetime2=newDateTime();
System.Threading.TimerThread_Time;

privatevoidbutton1_Click(objectsender,EventArgse)
{
//启动
Thread_Time=newSystem.Threading.Timer(Thread_Timer_Method,null,0,20);
time1=DateTime.Now;

}

voidThread_Timer_Method(objecto)
{
label1.Text=Convert.ToString((++num));
System.Threading.Thread.Sleep(3000);
}

privatevoidbutton2_Click(objectsender,EventArgse)
{
//停止
Thread_Time.Dispose();
time2=DateTime.Now;
MessageBox.Show(Convert.ToString(time2-time1));
}
}

实例解析

1、用Threading.Timer时的方法,和前面就不太相同了,所以的参数全部在构造函数中进行了设置,而且可以设置启动时间。而且没有提供start和stop方法来控制计时器。而且是以一种回调方法的方式实现,而不是通过事件来实现的。他们之间还是有区别的。

2、我们只有销毁掉对象来停止他。当你运行时,你会发现他和前面的Timers.Timer一样,是多线程的,主要表现在不会假死,调试运行报错。但跟让你奇怪的是,我们的代码竟然无法让她停止下来。调用了Dispose方法没有用。问题在那?然后有进行了测试,修改了间隔时间为100,200,500,1000,3000,4000。这几种情况。发现当间隔为500ms上述就是C#学习教程:C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/907270.html

(0)
上一篇 2021年10月24日
下一篇 2021年10月24日

精彩推荐