龙空技术网

傻傻分不清楚,C#中的3个定时器类详细解读

LabVIEW与自动化测试 1363

前言:

如今大家对“timer interval属性”可能比较重视,大家都需要知道一些“timer interval属性”的相关文章。那么小编也在网络上汇集了一些关于“timer interval属性””的相关知识,希望各位老铁们能喜欢,兄弟们快快来了解一下吧!

在C#中,主要有三种定时器:System.Timers.Timer,System.Threading.Timer和System.Windows.Forms.Timer,这么多个定时器类,是不是傻傻分不清楚了?其实它们之间的区别主要在于它们运行的方式和使用的线程,下面将详细介绍这3个定时器类。

定时器

System.Windows.Forms.Timer

System.Windows.Forms.Timer定时器主要应用于Windows Forms应用程序中,用于定期执行某个任务并且需要更新UI。例如,在某个倒计时程序中,每秒更新一次UI显示的倒计时数字。由于这个定时器实际上就是在UI线程自身上进行调用的,因此在这个定时器的EventHandler中可以直接获取和修改UI元素而不会出现问题。 此计时器最宜用于 Windows 窗体应用程序中,并且只能在窗体应用程序中使用。

1)构造函数

Timer()

初始化 Timer 类的新实例。

Timer(IContainer)

将指定的容器与 Timer 类的新实例一起初始化。

2)主要属性:

Enabled

获取或设置计时器是否正在运行。

Interval

获取或设置定时器的间隔时间(以毫秒为单位)

3)主要方法:

Dispose()

释放由 Component 使用的所有资源。

OnTick(EventArgs)

引发 Tick 事件。

Start()

启动计时器。

Stop()

停止计时器。

4)主要事件:

Disposed

在通过调用 Dispose() 方法释放组件时发生。

(继承自 Component)

Tick

当指定的计时器间隔已过去而且计时器处于启用状态时发生。

5)应用范例:

using System;using System.Windows.Forms;namespace WinForm_Timer{    public partial class Form1 : Form    {        private static Timer timer;        public Form1()        {            InitializeComponent();            // 创建一个新的定时器实例            timer = new Timer();            // 设置定时器间隔为1秒(1000毫秒)             timer.Interval = 1000;            // 注册Tick事件处理方法            timer.Tick += OnTimedEvent;            // 启动定时器              timer.Start();        }        private void OnTimedEvent(Object source, EventArgs e)        {            // 输出触发时间到UI界面,而不需要额外的线程或调度操作              lblTrigTime.Text = "定时器触发的时间: " + DateTime.Now;        }    }}

范例程序运行结果:

范例运行界面

System.Timers.Timer

这是.NET中最常用的定时器。它使用系统时钟,以毫秒为单位进行计时。当定时器到期时,它会调用一个事件处理器。由于System.Timers.Timer运行在后台线程上,因此不会阻塞UI线程。这种类型的定时器适合在多线程环境中使用,特别是在需要定期执行任务但又不希望阻塞UI的情况下。

1)构造函数:

Timer()

初始化 Timer 类的新实例,并将所有属性设置为初始值。

Timer(Double)

初始化 Timer 类的新实例,并将 Interval 属性设置为指定的毫秒数。

2)主要属性:

AutoReset

获取或设置一个布尔值,该值指示 Timer 是否应只引发一次 Elapsed 事件((false) 或重复 (true))。

Enabled

获取或设置一个值,该值指示 Timer 是否应引发 Elapsed 事件。

Interval

获取或设置引发 Elapsed 事件的间隔(以毫秒为单位)。

3)主要方法:

Start()

通过将 Enabled 设置为 true 开始引发 Elapsed 事件。

Stop()

通过将 Enabled 设置为 false 停止引发 Elapsed 事件。

4)主要事件:

Disposed

在通过调用 Dispose() 方法释放组件时发生。

(继承自 Component)

Elapsed

达到间隔时发生。

5)应用范例:

using System;using System.Timers;namespace ConsoleApp_SystemTimer{    internal class Program    {        private static Timer timer;        static void Main(string[] args)        {            // 设置定时器间隔为2秒(2000毫秒)            timer = new Timer(2000);            // 注册Elapsed事件处理方法            timer.Elapsed += OnTimedEvent;            // 设置定时器在触发Elapsed事件后是否自动重新开始            timer.AutoReset = true;            // 启动定时器            timer.Start();            Console.WriteLine("按任意键退出...");            // 等待用户按键以便观察Elapsed事件处理方法执行情况            Console.ReadKey();            // 停止定时器            timer.Stop();        }        private static void OnTimedEvent(Object source, ElapsedEventArgs e)        {            // 输出触发时间            Console.WriteLine("定时器触发的时间: {0:HH:mm:ss.fff}", e.SignalTime);        }    }}

范例程序运行结果:

Winform Timer

System.Threading.Timer

这是一个更通用的定时器,它允许你指定一个委托作为回调方法,该方法在指定的时间间隔后执行。与System.Timers.Timer不同,Timer运行在指定的线程上,因此可以用来在指定的线程上调度任务。当需要长时间运行的任务时,可以使用这个定时器。同时,它也适用于需要在非同步上下文中定期执行任务的情况。

1)构造函数

Timer(TimerCallback)

使用新创建的 Timer 对象作为状态对象,用一个无限周期和一个无限到期时间初始化 Timer 类的新实例。

Timer(TimerCallback, Object, Int32, Int32)

使用 32 位的有符号整数指定时间间隔,初始化 Timer 类的新实例。

Timer(TimerCallback, Object, Int64, Int64)

用 64 位有符号整数来度量时间间隔,以初始化 Timer 类的新实例。

Timer(TimerCallback, Object, TimeSpan, TimeSpan)

初始化 Timer 类的新实例,使用 TimeSpan 值来度量时间间隔。

Timer(TimerCallback, Object, UInt32, UInt32)

用 32 位无符号整数来度量时间间隔,以初始化 Timer 类的新实例。

2)主要属性

ActiveCount

获取当前活动的计时器计数。 活动计数器注册为在未来某一时间点进行计时且尚未取消。

3)主要方法

Change(Int32, Int32)

更改计时器的启动时间和方法调用之间的间隔,用 32 位有符号整数度量时间间隔。

Change(Int64, Int64)

更改计时器的启动时间和方法调用之间的间隔,用 64 位有符号整数度量时间间隔。

Change(TimeSpan, TimeSpan)

更改计时器的启动时间和方法调用之间的时间间隔,使用 TimeSpan 值度量时间间隔。

Change(UInt32, UInt32)

更改计时器的启动时间和方法调用之间的间隔,用 32 位无符号整数度量时间间隔。

4)主要事件

无。

5)应用范例

using System;using System.Threading;namespace ConsoleApp_ThreadTimer{    internal class Program    {        private static Timer timer;        static void Main(string[] args)        {            // 设置定时器初始等待时间为0,间隔时间为2秒(2000毫秒)            timer = new Timer(TimerCallback, null, 0, 2000);                        Console.WriteLine("按任意键退出...");            // 等待用户按键以便观察回调方法执行情况            Console.ReadKey();           }        // 回调方法,每隔2秒执行一次输出当前时间的方法。不使用state参数。        private static void TimerCallback(Object state)           {            // 输出回调时间            Console.WriteLine("定时器回调的时间: {0}", DateTime.Now);           }    }}

范例程序运行结果:

thread timer

总结

以下是三种定时器的总结:

1)System.Timers.Timer:这是一个后台线程的定时器,用于在服务器端执行周期性任务。它不会阻塞UI线程,因此适合在需要执行长时间运行的任务时使用。其优点是能够在后台线程上执行任务,而不会影响UI的响应性。但是需要注意的是,由于它运行在后台线程上,因此不能直接在事件处理方法中更新UI元素,需要通过委托或线程安全的方式来操作UI。

2)System.Threading.Timer:这是一个更通用的定时器,用于在指定的线程上调度任务。它可以设置回调方法,并指定初始等待时间和间隔时间。它适用于在多线程环境中使用,可以在非同步上下文中定期执行任务。由于Timer运行在指定的线程上,因此可以用来在指定的线程上调度任务。但是需要注意的是,如果回调方法中需要更新UI元素,也需要使用委托或线程安全的方式来操作UI。

3)System.Windows.Forms.Timer:这是一个专门为Windows Forms应用程序设计的定时器,用于定期执行任务并更新UI。它直接运行在UI线程上,因此可以直接在事件处理方法中获取和修改UI元素而不会出现问题。但是需要注意的是,由于它运行在UI线程上,如果定时器事件处理方法执行时间过长,会影响UI的响应性。因此,在使用Windows Forms Timer时需要注意控制事件处理方法的执行时间,避免阻塞UI线程。

总体而言,选择使用哪种定时器取决于您的应用程序类型、需求和运行环境。需要根据实际情况选择最适合的定时器来实现所需的功能。

标签: #timer interval属性 #定时器应用程序有哪些类型