国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

.NET中的Timer類型用法詳解

2020-01-24 02:29:16
字體:
來源:轉載
供稿:網友

在.NET FrameWork中有多個Timer,那么怎么根據實際情況進行選擇確實是一個問題。

總體而言,計時器共有以下四種:

多線程計時器:

1 System.Threading.Timer
2 System.Timers.Timer

特殊環境的單線程計時器:

1 System.Windows.Forms.Timer(使用環境:Windows Forms Timer)
2 System.Windows.Threading.DispatcherTimer( 使用環境:WPF timer);

單線程計時器比較安全, 因為運行在主線程中,對于更新 Windows Forms或者WPF 中控件的值 這種簡單任務來說更方便。 例如時鐘和計數顯示。否則,你需要一個多線程計時器。

原理:單線程使用消息循環機制,這意味著Tick事件總是在創建timer的那個線程上執行,同時也意味著如果上一個Tick消息還未被處理,即使時間超過了間隔時間,在消息循環中也只存在一個Tick消息。

示例代碼如下:

public static void Main(){System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer();tmr.Tick += new EventHandler(tmr_Tick);tmr.Start();//開始計時器tmr.Stop();//停止計時器tmr.Enabled =true;//設置或獲取計時器是否正在運行tmr.Interval = 10000; //計時器的時間間隔 (10秒),以毫秒為單位,在計時器事件tmr_Tick開始10秒后進行第一次執行.}void tmr_Tick(object sender, EventArgs e){  //到達指定時間間隔應處理的代碼}

當tmr_Tick執行時間較長,UI界面會卡頓,如下圖所示:

多線程計時器比較強大,精確,而且可擴展性強;使用多線程計時器時不會對主線程造成任何影響,也就不會出現上面圖片顯示的情況.

原理:多線程計時器使用回調方法并由線程池線程提供服務.當計時器間隔小于執行此回調(Tick方法)所需的時間時,回調可以同時在多個線程中執行,比如當計時器的時間間隔是5秒,但過了5秒后,上一次的回調仍未完成,此時新的回調將在新的線程中運行.在開發中需要避免此種情況。

System.Threading.Timer是最簡單的多線程計時器。
只要在使用 System.Threading.Timer,就必須保留對它的引用。對于任何托管對象,如果沒有對 Timer 的引用,計時器會被垃圾回收。即使 Timer 仍處在活動狀態,也會被回收。
 
在下面的例子中,計時器在5秒后開始定時1秒的調用Tick方法。

public static void Main(){int duetime = 5000;int period = 1000;System.Threading.Timer timer = new System.Threading.Timer(Tick,"給Tick方法傳的參數,object類型",duetime ,period );duetime = 10000;period = 2000;//修改等待時間為10秒和間隔時間為2秒timer.Change(duetime, period);//取消計時器timer.Dispose();}static void Tick(object data){ Console.WriteLine(data);//如果此時需要訪問控件,因為回調線程跟主線程是完全不同的兩個線各,因此需要使用Control.Invoke或BeginInvoke方法,來實現,例如:this.BeginInvoke((MethodInvoker)delegate(){  this.lbl_w.Text = data.ToString (); }); }

.net framework提供的另一個計時器System.Timers.Timer.簡單的對System.Threading.Timer進行了包裝。增加了下面幾個特性:

1.實現了Component,所以可以在設計器顯示。
2.用Interval屬性代替代替Change方法
3.添加了Elapsed事件, 啟動和停止timer的Start和Stop方法。
4.添加了AutoReset屬性 默認為True 來指定是否在每次指定的間隔結束時引發Elapsed事件,還是僅運行一次Elapsed事件就結束

示例代碼如下:

public static void MainThread(){ System.Timers.Timer Timer tmr=new System.Timers.Timer(); tmr.Interval=500; tmr.Elapsed+=newElapsedEventHandler(tmr_Elapsed); tmr.AutoReset = false; tmr.Start(); Console.ReadLine(); tmr.Stop(); Console.ReadLine(); tmr.Dispose();}void tmr_Elapsed(objectsender,ElapsedEventArgse){ Console.WriteLine("Tick...");}

結論:
WPF和Windows Forms的單線程計時器都非常適合小任務,尤其是界面更新的任務。例如時鐘和計數顯示。
否則,你只能使用多線程計時器,對于使用哪一種多線程計時器,可根據自己的需要來決定

希望本文所述對大家掌握.net中timer的用法有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宕昌县| 会同县| 镇远县| 黎城县| 黑山县| 巨野县| 崇州市| 庆阳市| 桓仁| 通道| 前郭尔| 鹤峰县| 永安市| 瓦房店市| 新疆| 壤塘县| 玉屏| 普陀区| 永泰县| 虎林市| 金门县| 武平县| 峨边| 镇赉县| 盐源县| 柘城县| 香港| 延庆县| 三门峡市| 宁津县| 如东县| 大足县| 门源| 合阳县| 民和| 专栏| 当阳市| 淮南市| 嵩明县| 清水县| 佛山市|