winform中我经常使用到定时器,比如我做过一个每隔10秒钟的时候要截屏一次的小工具就使用定时器来解决这些问题。以我的经验,有两种定时器可用。一个是作为Winform的一个组件Timer(System.Windows.Forms.Timer),这种定时器使用简单,操作方便。还有另一种定时器也经常被使用是 System.Timers.Timer,接下来我会将这两种定时器种写一个例子并作一下比较。
一、System.Windows.Forms.Timer做定时器
做winform项目时点左边可视化组件栏,找到下面的Timer,这个就是System.windows.forms.timer。将这个组件拖到Form里面,然后设置参数。
当拖到Form后,可以看到此时的Timer及其属性,设置其执行的频率,和是否开启,当然这些也可以在程序里面去设置
因此使用了一个定时器timer。会启动和关闭定时器timer.enable = true/false;设置频率为1秒则Interval=1000。然后写具体要执行的方法了。设置timer1的行为。
在Form1.cs加上timer1_Tick方法,如下所示代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { private int cnt = 0; public Form1() { InitializeComponent(); } private void timer1_Tick(object sender, EventArgs e) { cnt++; Console.WriteLine("timer1--- "+cnt); } } }
然后运行程序看一下效果,这样定时器就做出来了,而任务就写在timer1_Tick方法里面
二、System.Timers.Timer做定时器
使用System.Timers.Timer做定时器是一个不错的想法,当然它不像第一种方法一样是可见的,使用起来特别地简单,直接把组件拖到Winform上面就行了。而这里定时器的实现全是靠自己写代码来实现。直接贴上代码吧。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; //引入System.Timer using System.Timers; namespace WindowsFormsApplication1 { public partial class Form2 : Form { private int cnt = 0; private System.Timers.Timer myTimer; public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { //窗体打开时创建定时器,并设置执行频率时间 this.myTimer = new System.Timers.Timer(1000); //设置任务 this.myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed); this.myTimer.AutoReset = true; this.myTimer.Enabled = true; this.myTimer.Start(); } /** * myTimer定时器执行的任务 * */ private void myTimer_Elapsed(object sender, ElapsedEventArgs e) { cnt++; Console.WriteLine("myTimer-- "+cnt); } } }
运行程序看一下效果
这样我们也实现了定时器的功能。接下来比较一下这两种定时器。
三、System.Windows.Forms.Timer与System.Timers.Timer的比较
易用性比较:
System.Windows.Forms.timer由于是Winform组件,可使用拖拉的方式直接使用和设置参数。双击定时器就可以创建Task方法。开发确实非常容易。而System.Timers.timer则全部在程序里面去写,开发略为复杂。
执行线程比较:
System.Windows.Forms.timer是在UI线程里面执行的,因为在Task方法里可以直接调用Winform的UI元素,操作UI元互非常简单。而System.Timers.timer则是创建的新线程,不是在UI线程里面执行。因此操作UI元素要困难,只用使用委托然后跨线程来调用UI元素。
准备性比较:
System.Windows.Forms.timer定时器不频率不准确,你设置它1秒执行一次任务,但他并不完全按这个时间执行,有时候误差还相当大。而System.Timers.timer全完全按设置的时间频率执行,非常准备。
引起UI假死情况:
System.Windows.Forms.timer定时器会引起UI假死,因为它的运行是UI线程,如果定时任务比较复杂耗时,那UI会有卡的情况出现,这也是这种定时器执行不准的原因。而System.Timers.timer由于是另一个线程而不会出现这种问题。