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