如果你需要使用規(guī)律的時(shí)間間隔重復(fù)執(zhí)行一些方法,最簡(jiǎn)單的方式是使用定時(shí)器(timer)。與下邊的例子相比,定時(shí)器可以便捷、高效地使用內(nèi)存和資源:
new Thread (delegate() { while (enabled) { DoSomeAction(); Thread.Sleep (TimeSpan.FromHours (24)); } }).Start();這不僅僅會(huì)永久占用一個(gè)線程,而且如果沒(méi)有額外的代碼,DoSomeAction每天都會(huì)發(fā)生在更晚的時(shí)間。定時(shí)器解決了這些問(wèn)題。
.NET Framework 提供了 4 種定時(shí)器。下邊兩個(gè)類是通用的多線程定時(shí)器:
(1)System.Threading.Timer
(2)System.Timers.Timer
另外兩個(gè)是專用的單線程定時(shí)器:
(3)System.Windows.Forms.Timer (Windows Forms 的定時(shí)器)
(4)System.Windows.Threading.DispatcherTimer (WPF 的定時(shí)器)
多線程定時(shí)器更加強(qiáng)大、精確并且更加靈活,而單線程定時(shí)器對(duì)于一些簡(jiǎn)單的更新 Windows Forms 和 WPF 控件的任務(wù)來(lái)說(shuō)是安全的,并且更加便捷。
1.多線程定時(shí)器Permalink
System.Threading.Timer是最簡(jiǎn)單的多線程定時(shí)器:它僅僅有一個(gè)構(gòu)造方法和兩個(gè)普通方法(取悅于極簡(jiǎn)主義者,還有本書(shū)作者!)。在接下來(lái)的例子中,一個(gè)定時(shí)器在 5 秒鐘之后調(diào)用Tick方法來(lái)打印 “ tick… “,之后每秒打印一次直到用戶按下回車鍵:
using System;using System.Threading;class Program{ static void Main() { // 首次間隔 5000ms,之后間隔 1000ms Timer tmr = new Timer (Tick, "tick...", 5000, 1000); Console.ReadLine(); tmr.Dispose(); // 停止定時(shí)器并執(zhí)行清理工作 } static void Tick (object data) { // 這里運(yùn)行在一個(gè)線程池線程上 Console.WriteLine (data); // 打印 "tick..." }}之后可以通過(guò)調(diào)用Change方法來(lái)改變定時(shí)器的時(shí)間間隔。如果你希望定時(shí)器只觸發(fā)一次,可以指定Timeout.Infinite作為構(gòu)造方法的最后一個(gè)參數(shù)。
.NET Framework 在System.Timers命名空間下提供了另一個(gè)名字相同的定時(shí)器類。它只是封裝了 System.Threading.Timer,并在使用完全相同的底層引擎的前提下提供額外的便利。下面是增加功能的簡(jiǎn)介:
(1)實(shí)現(xiàn)了Component,允許用于 Visual Studio 的設(shè)計(jì)器中。
(2)Interval屬性代替了Change方法。
(3)Elapsed事件代替了回調(diào)委托。
(4)Enabled屬性用于開(kāi)始或停止定時(shí)器(默認(rèn)值是false)。
(5)Start和Stop方法,避免對(duì)Enabled屬性感到困惑。
(6)AutoReset標(biāo)識(shí)來(lái)指定是否為可重復(fù)的事件(默認(rèn)為true)。
SynchronizingObject屬性提供Invoke和BeginInvoke方法,用于在 WPF 和 Windows Forms 控件上安全調(diào)用方法。
這有個(gè)例子:
using System;using System.Timers; // 命名空間是 Timers 而不是 Threadingclass SystemTimer{ static void Main() { Timer tmr = new Timer(); // 無(wú)需任何參數(shù) tmr.Interval = 500; tmr.Elapsed += tmr_Elapsed; // 使用事件代替委托 tmr.Start(); // 開(kāi)啟定時(shí)器 Console.ReadLine(); tmr.Stop(); // 停止定時(shí)器 Console.ReadLine(); tmr.Start(); // 重啟定時(shí)器 Console.ReadLine(); tmr.Dispose(); // 永久停止定時(shí)器 } static void tmr_Elapsed (object sender, EventArgs e) { Console.WriteLine ("Tick"); }}
新聞熱點(diǎn)
疑難解答
圖片精選