C# Timer类详解

在winform编程中,我们经常会使用Timer类,但如何使用合适的Timer类就需要我们对Timer类有个详细的了解。

Timer类有三种:

1.定义在System.Windows.Forms里   (单线程)
2.定义在System.Threading.Timer类里   (多线程)
3.定义在System.Timers.Timer类里 (多线程)

System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制来取代线程池产生消息的机制实现的,类似于VB或Delphi中的Timer控件,内部使用API SetTimer实现的。这意味着Tick事件总是在创建timer的那个线程上执行,同时也意味着如果上一个Tick消息还未被处理,即使时间超过了间隔时间,在消息循环中也只存在一个Tick消息。单线程计时器基于Windows消息循环,应用程序会同步的处理计时器的消息,所以除非Tick事件的处理代码执行的非常快,否则UI界面会变得响应很慢。Windows Forms的计时器都非常适合小任务,尤其是界面更新的任务。例如时钟和计数显示。否则,你需要一个多线程计时器。单线程Timer主要缺点是计时不精确,而且必须有消息循环,Console Application(控制台应用程序)无法使用。


System.Timers.Timer和System.Threading.Timer非常类似,它们是通过.NET  Thread  Pool实现的,轻量,计时精确,对应用程序、消息没有特别的要求。

System.Threading.Timer 是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。在必须更新用户界面的情况下,建议不要使用该计时器,因为它的回调不在用户界面线程上发生。

System.Timers.Timer.简单的对System.Threading.Timer进行了包装。增加了下面几个特性。

实现了Component,所以可以在设计器显示。代替Change方法的一个Interval属性代替callback委托的一个Elapsed事件启动和停止timer的Enabled属性,默认是false。为了避免Enabled造成混乱,提供了Start和Stop方法。是否在每次指定的间隔结束时引发Elapsed时间,还是仅间隔第一次结束后运行的AutoReset属性。System.Timers.Timer还可以应用于WinForm,完全取代上面的Timer控件。它们的缺点是不支持直接的拖放,需要手工编码。

多线程Timer的执行意味着如果上一个Tick消息还未被处理,则线程池会在每次指定的间隔结束时在一个新的线程上执行下一个Tick消息,在消息循环中也会存在多个Tick消息。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中的Timer控件是一种计时器控件,可以在指定的时间间隔内执行指定的代码。Timer控件有两种型:System.Windows.Forms.Timer和System.Timers.Timer。其中,System.Windows.Forms.Timer是Windows窗体应用程序中使用的计时器,而System.Timers.Timer是在非UI线程中使用的计时器。 下面是System.Windows.Forms.Timer控件的详细介绍: 1. Timer控件的属性: - Enabled:获取或设置一个值,该值指示计时器是否应引发Tick事件。 - Interval:获取或设置计时器在引发Tick事件之前等待的时间间隔(以毫秒为单位)。 - Tag:获取或设置与控件关联的对象。 - Site:获取或设置控件的站点。 - CanRaiseEvents:获取一个指示组件是否可以引发事件的值。 - DesignMode:获取一个值,该值指示 Component 当前是否处于设计模式。 - Events:获取附加到此 Component 的事件处理程序的列表。 2. Timer控件的方法: - Start():启动计时器。 - Stop():停止计时器。 3. Timer控件的事件: - Tick:每当计时器间隔时间到达时发生。 下面是一个使用System.Windows.Forms.Timer控件的例子: ```csharp using System; using System.Windows.Forms; public class Form1 : Form { private Timer timer1; public Form1() { InitializeComponent(); timer1 = new Timer(); timer1.Interval = 1000; // 设置计时器间隔为1秒 timer1.Tick += new EventHandler(timer1_Tick); // 绑定Tick事件 timer1.Start(); // 启动计时器 } private void timer1_Tick(object sender, EventArgs e) { // 在这里编写计时器到达间隔时间后要执行的代码 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值