C#-Forms.Timer、Timers.Timer、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丢失

7、定时器任务执行时间比较长时,不建议使用Forms.Timer,会出现界面假死现象,建议使用Timers.Timer,不会界面假死,并且精度更高!

二、System.Timers.Timer

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

三、System.Threading.Timer
using System.Threading.Timer;
属于轻量级计时器,提供以指定的时间间隔执行方法的机制,无法继承此类。

 

 主要区别:

System.Threading.Timer和System.Timers.Timer是多线程的,只要时间到了,就会执行。哪怕前一次还没执行完,他还是会开个线程继续执行新的任务。

 System.Windows.Forms.Timer是单线程的,只有等前一次执行完了,才会执行第二次的任务。如果间隔5秒执行,如果第一次任务处理超过5秒,那么就会延后第二次任务。

注:Timers.Timer可为同一回调方法配置多个定时器,第一次执行为声明之后一个间隔,Threading.Timer为相同方法设置定时器时,只要一个定时器使用了 Timeout.Infinite,
会导致其他定时器也不能循环执行,可配置第一次执行的时间。

结论:
1、定时器中的执行任务比较耗时时,使用Timers.Timer和Threading.Timer更合适;

2、多线程时,Timers.Timer和Threading.Timer比较,建议使用Timers.Timer。

3、Forms.Timer适用在任务执行时间较短时使用。否则占用窗体UI线程,导致界面卡死等占用资源的情况。

posted @ 2021-12-09 15:08  卡萨丁·周  阅读(460)  评论(0编辑  收藏  举报