c#发展

首页 » 常识 » 常识 » 傻傻分不清楚,C中的3个定时器类详细解读
TUhjnbcbe - 2025/2/11 18:40:00

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

定时器

System.Windows.Forms.Timer

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

1)构造函数

2)主要属性:

3)主要方法:

4)主要事件:

5)应用范例:

usingSystem;usingSystem.Windows.Forms;namespaceWinForm_Timer{publicpartialclassForm1:Form{privatestaticTimertimer;publicForm1(){InitializeComponent();//创建一个新的定时器实例timer=newTimer();//设置定时器间隔为1秒(毫秒)timer.Interval=;//注册Tick事件处理方法timer.Tick+=OnTimedEvent;//启动定时器timer.Start();}privatevoidOnTimedEvent(Objectsource,EventArgse){//输出触发时间到UI界面,而不需要额外的线程或调度操作lblTrigTime.Text="定时器触发的时间:"+DateTime.Now;}}}

范例程序运行结果:

范例运行界面

System.Timers.Timer

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

1)构造函数:

2)主要属性:

3)主要方法:

4)主要事件:

5)应用范例:

usingSystem;usingSystem.Timers;namespaceConsoleApp_SystemTimer{internalclassProgram{privatestaticTimertimer;staticvoidMain(string[]args){//设置定时器间隔为2秒(毫秒)timer=newTimer();//注册Elapsed事件处理方法timer.Elapsed+=OnTimedEvent;//设置定时器在触发Elapsed事件后是否自动重新开始timer.AutoReset=true;//启动定时器timer.Start();Console.WriteLine("按任意键退出...");//等待用户按键以便观察Elapsed事件处理方法执行情况Console.ReadKey();//停止定时器timer.Stop();}privatestaticvoidOnTimedEvent(Objectsource,ElapsedEventArgse){//输出触发时间Console.WriteLine("定时器触发的时间:{0:HH:mm:ss.fff}",e.SignalTime);}}}

范例程序运行结果:

WinformTimer

System.Thading.Timer

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

1)构造函数

2)主要属性

3)主要方法

4)主要事件

无。

5)应用范例

usingSystem;usingSystem.Thading;namespaceConsoleApp_ThadTimer{internalclassProgram{privatestaticTimertimer;staticvoidMain(string[]args){//设置定时器初始等待时间为0,间隔时间为2秒(毫秒)timer=newTimer(TimerCallback,null,0,);Console.WriteLine("按任意键退出...");//等待用户按键以便观察回调方法执行情况Console.ReadKey();}//回调方法,每隔2秒执行一次输出当前时间的方法。不使用state参数。privatestaticvoidTimerCallback(Objectstate){//输出回调时间Console.WriteLine("定时器回调的时间:{0}",DateTime.Now);}}}

范例程序运行结果:

thadtimer

总结

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

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

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

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

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

1
查看完整版本: 傻傻分不清楚,C中的3个定时器类详细解读