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");
        }