C# 的計時器是通過多線程來實現的。主要思路是,創建一個做死循環的線程,讓該線程周期性的委托UI線程
法一:利用system.Timers命名空間下的Timer類,使用Elapsed事件另開一個線程(Timer類中的Interval方法可以循環觸發Elapsed事件)
1 private void Form1_Load(object sender, EventArgs e) 2 { 4 /////////*******system.Timers命名空間下的Timer類,使用Elapsed事件另開一個線程*******///////// 5 System.Timers.Timer TimersTime = new System.Timers.Timer(); 6 TimersTime.Elapsed += new ElapsedEventHandler(TimedLabelOne); 7 TimersTime.Interval = 1000; 8 TimersTime.Start();//aTimer.Enabled = true; 10 }
Elapsed事件中運行的方法
private void TimedLabelOne(object source, ElapsedEventArgs e) { time1.BeginInvoke(new TimeClock(TimeClocks1)); }
public delegate void TimeClock();//創建委托
public void TimeClocks1() { time1.Text = DateTime.Now.ToString("HH:mm:ss"); }
方法二:利用System.Threading.Timer類
private void Form1_Load(object sender, EventArgs e) { // 參數: // callback: // 一個 System.Threading.TimerCallback 委托,表示要執行的方法。 // // state: // 一個包含回調方法中,要使用信息的對象或 null。 // // dueTime: // 在之前的延遲時間量 callback 調用,以毫秒為單位。 指定 System.Threading.Timeout.Infinite 以防止啟動計時器。 // 指定零 (0) 可立即啟動計時器。 // // period: // 調用之間的時間間隔 callback, ,以毫秒為單位。 指定 System.Threading.Timeout.Infinite 可以禁用定期終止。 System.Threading.Timer ThreadingTime = new System.Threading.Timer(new TimerCallback(TimedLabelTwo),null,Timeout.Infinite,1000); // 更改計時器的啟動時間和方法調用之間的間隔,用 32 位有符號整數度量時間間隔。 // // 參數: // dueTime: // 延遲之前調用的回調方法時指定的時間量 System.Threading.Timer 構造的以毫秒為單位。 指定 System.Threading.Timeout.Infinite // 以防止計時器重新啟動。 指定零 (0) 可立即重新啟動計時器。 // // period: // 回調方法的調用之間的時間間隔時指定 System.Threading.Timer 構造的以毫秒為單位。 指定 System.Threading.Timeout.Infinite // 可以禁用定期終止。 ThreadingTime.Change(0, 1000); }
//委托UI線程給控件賦值 public delegate void TimeClock(); private void TimedLabelTwo(object state) { time1.BeginInvoke(new TimeClock(TimeClocks2)); } public void TimeClocks2() { time2.Text = DateTime.Now.ToString("HH:mm:ss"); }
法三:通過自己創建的線程循環調用自制的事件
public delegate void TimeHandle(object sender); public event TimeHandle TimeSelf;
private void Form1_Load(object sender, EventArgs e) { TimeSelf += new TimeHandle(TimedLabelThree); ThreadStart threadState = TimeRefresh; Thread thread = new Thread(threadState); thread.Start(); }
public void TimeRefresh() { while(true) { TimeSelf(this); Thread.Sleep(1000); } } private void TimedLabelThree(object state) { label1.BeginInvoke(new TimeClock(TimeClocks3)); }
public delegate void TimeClock(); public void TimeClocks3() { label1.Text = DateTime.Now.ToString("HH:mm:ss"); }
法四:創建一個死循環的線程,周期性的委托UI線程里的控件
private void Form1_Load(object sender, EventArgs e) { ThreadStart threadStart = test; Thread thread1 = new Thread(threadStart); thread1.Start(); } public void test() { while(true) { label2.BeginInvoke(new TimeClock(TimeClocks4)); Thread.Sleep(1000); } } public delegate void TimeClock(); public void TimeClocks4() { label2.Text = DateTime.Now.ToString("HH:mm:ss"); }
