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");
}
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。