[C#].NET中幾種Timer的使用實例
這篇博客將梳理一下.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.Timer
Timer 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í)行的。

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í)行的。

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

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

很熟悉的一個錯誤。因為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();
};
};
}

DispatcherTimer中Tick事件執(zhí)行是在主線程中進行的。
使用DispatcherTimer時有一點需要注意,因為DispatcherTimer的Tick事件是排在Dispatcher隊列中的,當系統(tǒng)在高負荷時,不能保證在Interval時間段執(zhí)行,可能會有輕微的延遲,但是絕對可以保證Tick的執(zhí)行不會早于Interval設置的時間。如果對Tick執(zhí)行時間準確性高可以設置DispatcherTimer的priority。例如:
DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.Send);
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- C#中高精度計時器Stopwatch的用法詳解
- C#使用Stopwatch實現(xiàn)計時功能
- C#?Stopwatch實現(xiàn)計算代碼運行時間
- C#中Stopwatch的使用及說明
- C# 中使用Stopwatch計時器實現(xiàn)暫停計時繼續(xù)計時功能
- 如何使用C# Stopwatch 測量微秒級精確度
- .NET/C# 使用Stopwatch測量運行時間
- C#使用StopWatch獲取程序毫秒級執(zhí)行時間的方法
- C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析
- C#中的Timer和DispatcherTimer使用實例
- C#中的三種定時計時器Timer用法介紹
- C#中三種Timer計時器的詳細用法
- 詳解C#中的定時器Timer類及其垃圾回收機制
- C#使用timer實現(xiàn)的簡單鬧鐘程序
- C# 中Stopwatch和timer的實現(xiàn)示例
相關文章
如何在C#中使用 CancellationToken 處理異步任務
這篇文章主要介紹了如何在C#中使用 CancellationToken 處理異步任務,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下2021-03-03
DevExpress實現(xiàn)TreeList按條件隱藏節(jié)點CheckBox的方法
這篇文章主要介紹了DevExpress實現(xiàn)TreeList按條件隱藏節(jié)點CheckBox的方法,需要的朋友可以參考下2014-08-08

