winform中对定时器的使用

时间:2024-03-29 20:11:02

    winform中我经常使用到定时器,比如我做过一个每隔10秒钟的时候要截屏一次的小工具就使用定时器来解决这些问题。以我的经验,有两种定时器可用。一个是作为Winform的一个组件Timer(System.Windows.Forms.Timer),这种定时器使用简单,操作方便。还有另一种定时器也经常被使用是 System.Timers.Timer,接下来我会将这两种定时器种写一个例子并作一下比较。

一、System.Windows.Forms.Timer做定时器

    做winform项目时点左边可视化组件栏,找到下面的Timer,这个就是System.windows.forms.timer。将这个组件拖到Form里面,然后设置参数。

 winform中对定时器的使用
winform中对定时器的使用
 
    当拖到Form后,可以看到此时的Timer及其属性,设置其执行的频率,和是否开启,当然这些也可以在程序里面去设置


winform中对定时器的使用
 

    因此使用了一个定时器timer。会启动和关闭定时器timer.enable = true/false;设置频率为1秒则Interval=1000。然后写具体要执行的方法了。设置timer1的行为。


winform中对定时器的使用
 在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方法里面

 
winform中对定时器的使用
二、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);
        }
    }
}

 运行程序看一下效果


winform中对定时器的使用
 这样我们也实现了定时器的功能。接下来比较一下这两种定时器。

三、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由于是另一个线程而不会出现这种问题。