.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(); } }
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(); } } }
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); } }
浙公网安备 33010602011771号