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

首頁 > 編程 > C# > 正文

[C#].NET中幾種Timer的使用實例

2019-10-29 21:17:10
字體:
來源:轉載
供稿:網(wǎng)友

這篇博客將梳理一下.NET中4個Timer類,及其用法。

1. System.Threading.Timer

public Timer(TimerCallback callback, object state, int dueTime, int period);

callback委托將會在period時間間隔內重復執(zhí)行,state參數(shù)可以傳入想在callback委托中處理的對象,dueTime標識多久后callback開始執(zhí)行,period標識多久執(zhí)行一次callback。

using System.Threading;// System.Threading.TimerTimer timer = new Timer(delegate{ Console.WriteLine($"Timer Thread: {Thread.CurrentThread.ManagedThreadId}"); Console.WriteLine($"Is Thread Pool: {Thread.CurrentThread.IsThreadPoolThread}"); Console.WriteLine("Timer Action.");},null,2000,1000);Console.WriteLine("Main Action.");Console.WriteLine($"Main Thread: {Thread.CurrentThread.ManagedThreadId}");Console.ReadLine();

Timer回掉方法執(zhí)行是在另外ThreadPool中一條新線程中執(zhí)行的。

asp.net,timer用法,timer定時,.net,timer

2. System.Timers.Timer

System.Timers.Timer和System.Threading.Timer相比,提供了更多的屬性,

Interval  指定執(zhí)行Elapsed事件的時間間隔;

Elapsed  指定定期執(zhí)行的事件;

Enabled  用于Start/Stop Timer;

Start    開啟Timer

Stop    停止Timer

System.Timers.Timer timer = new System.Timers.Timer();timer.Interval = 500;timer.Elapsed += delegate{ Console.WriteLine($"Timer Thread: {Thread.CurrentThread.ManagedThreadId}"); Console.WriteLine($"Is Thread Pool: {Thread.CurrentThread.IsThreadPoolThread}"); Console.WriteLine("Timer Action"); timer.Stop();};timer.Start();Console.WriteLine("Main Action.");Console.WriteLine($"Main Thread: {Thread.CurrentThread.ManagedThreadId}");Console.ReadLine();

Timer Elapsed定期任務是在ThreadPool的線程中執(zhí)行的。

asp.net,timer用法,timer定時,.net,timer

3. System.Windows.Forms.Timer

Interval  指定執(zhí)行Elapsed事件的時間間隔;

Tick       指定定期執(zhí)行的事件;

Enabled  用于Start/Stop Timer;

Start    開啟Timer

Stop    停止Timer

使用System.Windows.Forms.Timer來更新窗體中Label內時間,

using System.Windows.Forms;public Form1(){ InitializeComponent(); this.Load += delegate {  Timer timer = new Timer();  timer.Interval = 500;  timer.Tick += delegate  {   System.Diagnostics.Debug.WriteLine($"Timer Thread: {System.Threading.Thread.CurrentThread.ManagedThreadId}");   System.Diagnostics.Debug.WriteLine($"Is Thread Pool: {System.Threading.Thread.CurrentThread.IsThreadPoolThread}");   this.lblTimer.Text = DateTime.Now.ToLongTimeString();  };  timer.Start();  System.Diagnostics.Debug.WriteLine($"Main Thread: {System.Threading.Thread.CurrentThread.ManagedThreadId}"); };}

asp.net,timer用法,timer定時,.net,timer

Timer Tick事件中執(zhí)行的事件線程與主窗體的線程是同一個,并沒有創(chuàng)建新線程(或者使用ThreadPool中線程)來更新UI。下面將代碼做一個改動,使用System.Timers.Timer來更新UI上的時間,代碼如下,

public Form1(){ InitializeComponent(); this.Load += delegate {  System.Timers.Timer timer = new System.Timers.Timer();  timer.Interval = 500;  timer.Elapsed += delegate  {   System.Diagnostics.Debug.WriteLine($"Timer Thread: {System.Threading.Thread.CurrentThread.ManagedThreadId}");   System.Diagnostics.Debug.WriteLine($"Is Thread Pool: {System.Threading.Thread.CurrentThread.IsThreadPoolThread}");   this.lblTimer.Text = DateTime.Now.ToLongTimeString();  };  timer.Start();  System.Diagnostics.Debug.WriteLine($"Main Thread: {System.Threading.Thread.CurrentThread.ManagedThreadId}"); };}

asp.net,timer用法,timer定時,.net,timer

很熟悉的一個錯誤。因為Label是由UI線程創(chuàng)建的,所以對其進行修改需要在UI線程中進行。System.Timers.Timer中Elasped執(zhí)行是在ThreadPool中新創(chuàng)建的線程中執(zhí)行的。所以會有上面的錯誤。

4. System.Windows.Threading.DispatcherTimer

屬性和方法與System.Windows.Forms.Timer類似。

using System.Windows.Threading;public MainWindow(){ InitializeComponent(); this.Loaded += delegate {  //DispatcherTimer  DispatcherTimer timer = new DispatcherTimer();  timer.Interval = TimeSpan.FromSeconds(1);  timer.Start();  Debug.WriteLine($"Main Thread Id: {Thread.CurrentThread.ManagedThreadId}");  timer.Tick += delegate  {   tbTime.Text = DateTime.Now.ToLongTimeString();   Debug.WriteLine($"Timer Thread Id: {Thread.CurrentThread.ManagedThreadId}");   timer.Stop();  }; };}

asp.net,timer用法,timer定時,.net,timer

DispatcherTimer中Tick事件執(zhí)行是在主線程中進行的。

使用DispatcherTimer時有一點需要注意,因為DispatcherTimer的Tick事件是排在Dispatcher隊列中的,當系統(tǒng)在高負荷時,不能保證在Interval時間段執(zhí)行,可能會有輕微的延遲,但是絕對可以保證Tick的執(zhí)行不會早于Interval設置的時間。如果對Tick執(zhí)行時間準確性高可以設置DispatcherTimer的priority。例如:

DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.Send);

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關教程知識閱讀請移步到c#教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 蓝田县| 舒兰市| 当涂县| 客服| 铁力市| 冀州市| 玛沁县| 沙田区| 义乌市| 平舆县| 班戈县| 民乐县| 叶城县| 辽中县| 武安市| 临夏县| 鄄城县| 乌恰县| 巴南区| 宜章县| 香港| 肇东市| 宽甸| 专栏| 泾阳县| 莎车县| 四川省| 吕梁市| 右玉县| 金山区| 忻州市| 北辰区| 潜江市| 元谋县| 两当县| 嘉善县| 东兴市| 卓尼县| 大化| 美姑县| 合水县|