.NET 计时器(Timer)

System.Windows.Forms.Timer  是System.Windows.Forms命名空间下的计时器,称作Windows计时器。Windows计时器是建立在基于消息的UI线程上运行,只适合于WinForm窗体应用程序中使用。

System.Threading.Timer 是System.Threading命名空间下的计时器,称作线程计时器。它会在线程池(ThreadPool)中创建一个辅助线程来计时,而不会与主线程发生直接的关系,它可谓是.NET中最精准完美的计时器了

System.Timers.Timer 是System.Timers命名空间下的计时器,称作服务器计时器。它的工作原理是通过上一种计时器实现的,所以也工作在辅助线程。它继承自Component,你可以将它作为组件添加到VS设计器工具箱里。或许这样做会使它变得比前一种计时器更容易使用。

Windows计时器

#region 程序集 System.Windows.Forms.dll, v4.0.0.0
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.Windows.Forms.dll
#endregion

using System;
using System.ComponentModel;

namespace System.Windows.Forms
{
    // 摘要: 
    //     实现按用户定义的时间间隔引发事件的计时器。 此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用。
    [DefaultEvent("Tick")]
    [DefaultProperty("Interval")]
    [ToolboxItemFilter("System.Windows.Forms")]
    public class Timer : Component
    {
        // 摘要: 
        //     初始化 System.Windows.Forms.Timer 类的新实例。
        public Timer();
        //
        // 摘要: 
        //     将指定的容器与 System.Windows.Forms.Timer 类的新实例一起初始化。
        //
        // 参数: 
        //   container:
        //     表示计时器的容器的 System.ComponentModel.IContainer。
        public Timer(IContainer container);

        // 摘要: 
        //     获取或设置计时器是否正在运行。
        //
        // 返回结果: 
        //     如果计时器当前处于启用状态,则为 true;否则为 false。 默认值为 false。
        [DefaultValue(false)]
        public virtual bool Enabled { get; set; }
        //
        // 摘要: 
        //     获取或设置在相对于上一次发生的 System.Windows.Forms.Timer.Tick 事件引发 System.Windows.Forms.Timer.Tick
        //     事件之前的时间(以毫秒为单位)。
        //
        // 返回结果: 
        //     System.Int32 指定在相对于上一次发生的 System.Windows.Forms.Timer.Tick 事件引发 System.Windows.Forms.Timer.Tick
        //     事件之前的毫秒数。 该值不能小于 1。
        [DefaultValue(100)]
        public int Interval { get; set; }
        //
        // 摘要: 
        //     获取或设置一个任意字符串,表示某种类型的用户状态。
        //
        // 返回结果: 
        //     一个任意字符串,表示某种类型的用户状态。
        [Bindable(true)]
        [DefaultValue("")]
        [Localizable(false)]
        [TypeConverter(typeof(StringConverter))]
        public object Tag { get; set; }

        // 摘要: 
        //     当指定的计时器间隔已过去而且计时器处于启用状态时发生。
        public event EventHandler Tick;

        // 摘要: 
        //     释放由计时器使用的资源(内存除外)。
        //
        // 参数: 
        //   disposing:
        //     true 表示释放托管资源和非托管资源。 设置为 false 将只释放非托管资源。
        protected override void Dispose(bool disposing);
        //
        // 摘要: 
        //     引发 System.Windows.Forms.Timer.Tick 事件。
        //
        // 参数: 
        //   e:
        //     一个 System.EventArgs,其中包含事件数据。 这总是 System.EventArgs.Empty。
        protected virtual void OnTick(EventArgs e);
        //
        // 摘要: 
        //     启动计时器。
        public void Start();
        //
        // 摘要: 
        //     停止计时器。
        public void Stop();
        //
        // 摘要: 
        //     返回表示 System.Windows.Forms.Timer 的字符串。
        //
        // 返回结果: 
        //     表示当前 System.Windows.Forms.Timer 的字符串。
        public override string ToString();
    }
}
System.Windows.Forms.Timer

 this.timer1.Interval = 1000; //设定每1秒钟触发一次Tick事件

 this.timer1.Tick += new System.EventHandler(this.timer1_Tick);  

 timer1.Start(); //与 timer1.Enabled=true; 等效 

...

private void timer1_Tick(object sender, EventArgs e)
 {
  Text = DateTime.Now.ToString("yyyy年M月d日 hh:mm:ss.fff"); //在窗口标题栏显示当前时间   
 }

System.Threading.Timer 例子

MSDN解释:https://msdn.microsoft.com/zh-cn/library/system.threading.timer%28v=vs.80%29.aspx

using System;
using System.Threading;

class TimerExample
{
    static void Main()
    {
        AutoResetEvent autoEvent     = new AutoResetEvent(false);
        StatusChecker  statusChecker = new StatusChecker(10);

        // Create the delegate that invokes methods for the timer.
        TimerCallback timerDelegate = 
            new TimerCallback(statusChecker.CheckStatus);

        // Create a timer that signals the delegate to invoke 
        // CheckStatus after one second, and every 1/4 second 
        // thereafter.
        Console.WriteLine("{0} Creating timer.\n", 
            DateTime.Now.ToString("h:mm:ss.fff"));
        Timer stateTimer = 
                new Timer(timerDelegate, autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every 
        // 1/2 second.
        autoEvent.WaitOne(5000, false);
        stateTimer.Change(0, 500);
        Console.WriteLine("\nChanging period.\n");

        // When autoEvent signals the second time, dispose of 
        // the timer.
        autoEvent.WaitOne(5000, false);
        stateTimer.Dispose();
        Console.WriteLine("\nDestroying timer.");
    }
}

class StatusChecker
{
    int invokeCount, maxCount;

    public StatusChecker(int count)
    {
        invokeCount  = 0;
        maxCount = count;
    }

    // This method is called by the timer delegate.
    public void CheckStatus(Object stateInfo)
    {
        AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
        Console.WriteLine("{0} Checking status {1,2}.", 
            DateTime.Now.ToString("h:mm:ss.fff"), 
            (++invokeCount).ToString());

        if(invokeCount == maxCount)
        {
            // Reset the counter and signal Main.
            invokeCount  = 0;
            autoEvent.Set();
        }
    }
}
DEMO

System.Timers.Timer

 MSDN解释:https://msdn.microsoft.com/zh-cn/library/system.timers.timer%28v=vs.110%29.aspx

using System;    
using System.Timers;    
   
public class Timer1    
{    
    // 声明一个服务器计时器 aTimer    
    private static System.Timers.Timer aTimer;    
   
    public static void Main()    
     {    
        // 通常,该计时器被声明在类级别里,例如此段代码。但是如果将计时器声明在    
        // 一个较长执行的方法中,GC垃圾回收器也许会在该方法执行后将计时器回收掉,    
        // 那么它委托的方法会因此失效导致错误。所以必须在该方法的最后一行加上    
        // KeepAlive方法告诉GC不要回收此计时器。见此方法最后面的注释。    
        
        // 创建一个10秒的服务器计时器    
         aTimer = new System.Timers.Timer(10000);    
        // 将计时器的Elapsed事件委托给OnTimedEvent方法    
         aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);    
        // 设置计时器的计时间隔为2秒    
         aTimer.Interval = 2000;    
        // 开始计时器    
         aTimer.Enabled = true;    
   
         Console.WriteLine("按回车键退出程序。");    
         Console.ReadLine();    
   
        // 如果计时器是在一个会较长执行的代码中声明的,应该在此调用KeepAlive方法,    
        // 保护它不被GC(垃圾回收器)回收:    
        //GC.KeepAlive(aTimer);    
     }    
   
    // OnTimedEvent执行代码    
    private static void OnTimedEvent(object source, ElapsedEventArgs e)    
     {    
         Console.WriteLine("Elapsed 事件被触发,触发时间:{0}", e.SignalTime);    
     }    
}  
DEMO

 

posted on 2015-03-19 10:45  二狗你变了  阅读(845)  评论(0)    收藏  举报

导航