在C#中,主要有三种定时器:System.Timers.Timer,System.Thading.Timer和System.Windows.Forms.Timer,这么多个定时器类,是不是傻傻分不清楚了?其实它们之间的区别主要在于它们运行的方式和使用的线程,下面将详细介绍这3个定时器类。
定时器
System.Windows.Forms.TimerSystem.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线程。
总体而言,选择使用哪种定时器取决于您的应用程序类型、需求和运行环境。需要根据实际情况选择最适合的定时器来实现所需的功能。