C# 计时器

来源:互联网 发布:js 比较两个值 编辑:程序博客网 时间:2024/04/29 23:18

C#中,有三个计时器Timer类,分别是System.Timers.Timer、System.Windows.Forms.Timer、System.Threading.Timer。
    System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API SetTimer实现的。它的主要缺点是计时不精确,而且必须有消息循环,Console  Application(控制台应用程序)无法使用。
    System.Timers.Timer和System.Threading.Timer非常类似,它们是通过.NET Thread Pool实现的,轻量,计时精确,对应用程序、消息没有特别的要求。System.Timers.Timer还可以应用于WinForm,完全取代上面的Timer控件。它们的缺点是不支持直接的拖放,需要手工编码。

System.Windows.Forms.Timer
    实现按用户定义的时间间隔引发事件的计时器。此计时器最宜用于 Windows 窗体应用程序中,且必须在窗口中使用。System.Windows.Forms.Timer继承至 System.ComponentModel.Component ,是一个组件,在设计阶段可以直接拖拽到窗体上,用法比较简单,这也是它最大的优势。Windows 计时器组件是单线程组件,是为单线程环境设计的,精度限定为 55 毫秒。如果您需要更高精度的多线程计时器,请使用 System.Timers 命名空间中的 Timer
1、构造方法:
   Timer(): 初始化 Timer 类的新实例。
   Timer( IContainer container ):将 Timer 与容器对象相关联。通过这样的关联,就将 Timer 的生存期的控制权移交给了容器。在应用程序中使用了许多组件并希望同时释放它们时,这非常有用。例如,如果将ToolTipImageListTimerContainer 相关联,则调用 Container 上的 Dispose 也将强制释放所有这些组件。这些组件将一直存在,直到其容器将它释放到垃圾回收为止。即:将组件关联于容器进行更好的自动垃圾回收控制。
2、属性
   bool Enabled:获取与设置是否启动计时器。
   int Interval:获取与设置计时器的时间间隔。
   注意: 当Enable为 true 时,不论外部是否具有其引用,计时器都不受“垃圾回收”的释放。
3、方法
   public void Start():启动计时器,等效于将Enable设置为true。

  
public void Stop():停止计时器,等效于将Enable设置为false。
   protected
virtualvoid OnTick( EventArgs e ):如果从 Timer 继承,则可以重写此方法。
                      计时器每次开始计时调用此方法,它调用通过Tick事件添加的任何方法。
              
   注意: 在通过调用 Stop 禁用了计时器之后调用Start ,会导致计时器重新启动中断的时间间隔,也即之前的计时重新置0。如果计时器设置了 5000 毫秒的时间间隔,而在大约 3000 毫米时调用Stop,则调用Start 会导致计时器在引发 Tick事件之前等待 5000 毫秒。
4、事件 :public event EventHandler Tick

System.Timers.Timer
    System.Timers.Timer也是继承至System.ComponentModel.Component,也是一个组件。虽然该组件可以用于Windows Forms,但是无法像Windows计时器组件那样可以方便的拖拽到窗体上使用,必须编写更为复杂的代码。该组件是基于服务器的计时器,能够指定在应用程序中引发Elapsed 事件的周期性间隔。基于服务器的计时器是为在多线程环境中用于辅助线程而设计的,它可以在线程间移动来处理引发的 Elapsed事件,这样就可以比 Windows 计时器更精确地按时引发事件。有关基于服务器的计时器的更多信息,请参见“基于服务器的计时器介绍”。
     System.Timers命名空间只有1个委托
ElapsedEventHandler和3个类Timer、ElapsedEventArgsTimersDescriptionAttribute。因为该计时器组件是基于服务器的多线程环境,牵涉到线程相关的知识,所以在后面再慢慢研究。

例:
点击一个start的button开始计时,时间到时,就执行某个事件(theout),在这个例子里就show一下时间值。
System.Timers.Timer t = new System.Timers.Timer();//
实例化Timer类

private void btnStart_Click(object sender, EventArgs e)
{
int intTime = Convert.ToInt32(cmbTimer.Text.ToString()) * 60 * 60 * 1000;
t.Interval = intTime;//设置间隔时间,为毫秒;
t.Elapsed += new System.Timers.ElapsedEventHandler(theout);//到达时间的时候执行事件;
t.AutoReset = true;//设置是执行一次搜索(false)还是一直执行(true);
t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
}
public void theout(object source, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show(e.SignalTime.ToString());
}


System.Threading.Timer
    System.Threading.Timer是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务。不建议将其用于 Windows 窗体,因为其回调不在用户界面线程上进行。System.Windows.Forms.Timer是用于 Windows 窗体的更佳选择。要获取基于服务器的计时器功能,可以考虑使用 System.Timers.Timer,它可以引发事件并具有其他功能。只要在使用Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。这点和Windows计时器是不相同的。

摘自:
http://blog.sina.com.cn/s/blog_48a45b950100erei.html 
0 0
原创粉丝点击