一、Forms.Timer

using System.Windows.Forms.Timer;

实现按用户定义的时间间隔引发事件的计时器。此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用。

这个类在Windows应用程序中使用,用来定期把WM_TIMER消息放到程序的消息队列中。当程序从队列中获取消息后,它会在主用户接口线程中同步处理,这对Windows应用程序来说非常重要。精度限定:55ms(引用自图书《C#图解教程(第四版)》439页)

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

示例程序:(解释Forms.Timer和Winform的窗体共用一个线程,现象:界面假死)

1、Winform窗体控件布局

2.源代码

using System;
using System.Threading;
using System.Windows.Forms;
namespace Windows.Forms.Timer
    public partial class Form1 : Form
        int num = 0;
        public Form1()
            InitializeComponent();
        private void button1_Click(object sender, EventArgs e)
            timer1.Start();
        private void button2_Click(object sender, EventArgs e)
            timer1.Stop();
        private void timer1_Tick(object sender, EventArgs e)
            label1.Text = (++num).ToString();
            Thread.Sleep(3000); 

3.执行效果

点击Start按钮后,界面假死3秒后,才可以移动窗体或点击控件按钮。

二、Timers.Timer

using System.Timers.Timer;

在应用程序中生成定期事件。 精度相比Forms.Timer高,100ms间隔时,精度在10ms~20ms之间。(个人电脑测试)

这个类更复杂,它包含了很多成员,使我们可以通过属性和方法来操作计时器。它还有一个叫做Elapsed的成员事件,每次时间到期就会引发这个事件。这个计时器可以运行在用户接口线程或工作者线程上。(引用自图书《C#图解教程(第四版)》439页)

示例程序:

1.源代码

using System;
using System.Diagnostics;
using System.Timers;
namespace Timers
    class Program
        static void Main(string[] args)
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Timer timer = new Timer();
            timer.Enabled = true;//设置是否执行Elapsed事件
            timer.Elapsed += new ElapsedEventHandler(printa);//绑定Elapsed事件
            timer.Interval =100;//设置时间间隔
            while (sw.ElapsedMilliseconds < 1000)    //使定时器执行1s,之后停止
            timer.Stop();
            Console.ReadKey();
        public static void printa(object sender, ElapsedEventArgs e)
            Console.WriteLine(DateTime.Now.ToString("hh:mm:ss.fff") + "执行Timer");

2.执行结果

结果分析:100ms间隔时,精度在20ms以内。

三、Threading.Timer

using System.Threading.Timer;

属于轻量级计时器,提供以指定的时间间隔执行方法的机制,无法继承此类。  精度相比Forms.Timer高,100ms间隔时,精度在10ms~20ms之间。(个人电脑测试)

计时器在每次时间到期之后调用回调方法。构造函数结构如下(引用自图书《C#图解教程(第四版)》438页):

示例程序:

1.源代码

using System;
using System.Threading;
using System.Diagnostics;
namespace Timers
    class Program
        static Stopwatch sw = new Stopwatch();
        int TimesCalled = 0;
        void Display(object state)
            Console.WriteLine("{0} {1},{2}", (string)state, ++TimesCalled,/*sw.ElapsedMilliseconds */DateTime.Now.ToString("HH:mm:ss.fff"));
        static void Main()
            Program p = new Program();
            sw.Start();
            Timer myTimer = new Timer(p.Display, "Processing timer event", 2000, 100);
            Console.WriteLine("Timer started.");
            Console.ReadLine();

2.执行结果

结果分析:100ms间隔时,精度在20ms以内。此程序调试时,需要强行停止。

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

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

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

相关参考:

1、[C#].NET中的三种Timer的区别和用法_傲雪飞狐-CSDN博客_c# timer

2、C#教程之C#中Forms.Timer、Timers.Timer、Threading.Timer_lzp_k2的专栏-CSDN博客

一、Forms.Timerusing System.Windows.Forms.Timer;实现按用户定义的时间间隔引发事件的计时器。此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用。这个类在Windows应用程序中使用,用来定期把WM_TIMER消息放到程序的消息队列中。当程序从队列中获取消息后,它会在主用户接口线程中同步处理,这对Windows应用程序来说非...
本文实例讲述了C#Forms.TimerTimers.TimerThreading.Timer的用法分析,分享给大家供大家参考。具体分析如下: 在.NET Framework里面提供了三种Timer ① System.Windows.Forms.Timer ② System.Timers.Timer ③ System.Threading.Timer 现分述如下: 一、System.Windows.Forms.Timer 1、基于Windows消息循环,用事件方式触发,在界面线程执行;是使用得比较多的TimerTimer Start之后定时(按设定的Interval)调用挂接在Tick事
Threading.Timer 属于100% 多线程 Timers.Timer 默认多线程,可设置为单线程 既然是多线程,不管通过回调 还是事件 执行任务,都是开启的另一个线程; 你可以暂停或销毁计时器(Timer)本身,但是不能操作里面新开线程的任务,这也是多线程设计的期望方式,因为你不知道 超线程里面到底执行到哪儿了。 但是,像我这种(刁民)有时候就喜欢那么横,所以就把 新开的任务装在一个 n...
System.Threading.Timer类可以用来执行定时任务 例如每隔0.5s输出一些东西 public static void Main(string[] args) Timer timer = new(callback: Callback, state: "张三", dueTime: 3000, period: 500); void Callback(object state) Console 2:System.Timers.Timer 特殊目的的单线程计时器: 1:System.Windows.Forms.Timer(Windows Forms Timer) 2:System.Windows.Threading.DispatcherTimer(WPF ti System.Timers.Timer timer; //定义委托 public delegate void SetControlValue(string value); public Form1() Initialize
我在form中创建了个计时器timertimer时间中调用处理方法Run(),实现定时任务,同时定时任务在执行过程中会刷新状态栏数据,但是每次执行过程中form就是卡死,结果状态栏每次看到都是最后一次的刷新的情况?请问要怎么解决? Run的代码就是普通函数,读取文件,因为文件比较多耗时长 这个提供了backgroundworker控件来实现你需求的,timer控件和界面同一个线程跑,大任...
System.Timers.Timer和System.Windows.Forms.Timer是有区别的。 我一个是非堵塞的,一个不是。更重要的的System.Timer是多线程的,如果控制不好执行时间的话,线程数会不断的增加。 测试代码:public partial class Form1 : Form private System.Timers.Timer tim
可以使用`threading.Timer`的`cancel()`方法来取消定时器。如果你有多个定时器,可以把它们存储在一个列表中,然后遍历列表,调用每个定时器的`cancel()`方法来取消它们。 以下是一个示例代码: ```python import threading # 创建定时器 t1 = threading.Timer(5.0, lambda: print("Timer 1 expired")) t2 = threading.Timer(10.0, lambda: print("Timer 2 expired")) # 启动定时器 t1.start() t2.start() # 取消所有定时器 timers = [t1, t2] for t in timers: t.cancel() 在上面的代码中,我们创建了两个定时器`t1`和`t2`,并启动它们。然后,我们将它们存储在一个列表中,并遍历列表,调用每个定时器的`cancel()`方法来取消它们。