[C#].NET中幾種Timer的使用實(shí)例
這篇博客將梳理一下.NET中4個(gè)Timer類,及其用法。
1. System.Threading.Timer
public Timer(TimerCallback callback, object state, int dueTime, int period);
callback委托將會(huì)在period時(shí)間間隔內(nèi)重復(fù)執(zhí)行,state參數(shù)可以傳入想在callback委托中處理的對(duì)象,dueTime標(biāo)識(shí)多久后callback開(kāi)始執(zhí)行,period標(biāo)識(shí)多久執(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事件的時(shí)間間隔;
Elapsed 指定定期執(zhí)行的事件;
Enabled 用于Start/Stop Timer;
Start 開(kāi)啟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定期任務(wù)是在ThreadPool的線程中執(zhí)行的。

3. System.Windows.Forms.Timer
Interval 指定執(zhí)行Elapsed事件的時(shí)間間隔;
Tick 指定定期執(zhí)行的事件;
Enabled 用于Start/Stop Timer;
Start 開(kāi)啟Timer
Stop 停止Timer
使用System.Windows.Forms.Timer來(lái)更新窗體中Label內(nèi)時(shí)間,
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í)行的事件線程與主窗體的線程是同一個(gè),并沒(méi)有創(chuàng)建新線程(或者使用ThreadPool中線程)來(lái)更新UI。下面將代碼做一個(gè)改動(dòng),使用System.Timers.Timer來(lái)更新UI上的時(shí)間,代碼如下,
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}");
};
}

很熟悉的一個(gè)錯(cuò)誤。因?yàn)長(zhǎng)abel是由UI線程創(chuàng)建的,所以對(duì)其進(jìn)行修改需要在UI線程中進(jìn)行。System.Timers.Timer中Elasped執(zhí)行是在ThreadPool中新創(chuàng)建的線程中執(zhí)行的。所以會(huì)有上面的錯(cuò)誤。
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í)行是在主線程中進(jìn)行的。
使用DispatcherTimer時(shí)有一點(diǎn)需要注意,因?yàn)镈ispatcherTimer的Tick事件是排在Dispatcher隊(duì)列中的,當(dāng)系統(tǒng)在高負(fù)荷時(shí),不能保證在Interval時(shí)間段執(zhí)行,可能會(huì)有輕微的延遲,但是絕對(duì)可以保證Tick的執(zhí)行不會(huì)早于Interval設(shè)置的時(shí)間。如果對(duì)Tick執(zhí)行時(shí)間準(zhǔn)確性高可以設(shè)置DispatcherTimer的priority。例如:
DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.Send);
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C# WinForm-Timer控件的使用
- c# 區(qū)分幾種定時(shí)器(timer)
- C#用timer實(shí)現(xiàn)背單詞小程序
- 詳解C#中的System.Timers.Timer定時(shí)器的使用和定時(shí)自動(dòng)清理內(nèi)存應(yīng)用
- C#中Timer使用及解決重入問(wèn)題
- C#中自定義高精度Timer定時(shí)器的實(shí)例教程
- 詳解C#中的定時(shí)器Timer類及其垃圾回收機(jī)制
- C#自定義基于控制臺(tái)的Timer實(shí)例
- C#中timer定時(shí)器用法實(shí)例
- C#使用timer實(shí)現(xiàn)的簡(jiǎn)單鬧鐘程序
- C#使用timer定時(shí)在屏幕上輸出信息的方法
- C#中的Timer和DispatcherTimer使用實(shí)例
- C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析
- c#各種Timer類的區(qū)別與用法介紹
- C#中timer類的用法總結(jié)
- C#中的三種定時(shí)計(jì)時(shí)器Timer用法介紹
相關(guān)文章
.NET(C#):Emit創(chuàng)建異常處理的方法
.NET(C#):Emit創(chuàng)建異常處理的方法,需要的朋友可以參考一下2013-04-04
Unity 按鈕事件封裝操作(EventTriggerListener)
這篇文章主要介紹了Unity 按鈕事件封裝操作(EventTriggerListener),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
C#實(shí)現(xiàn)將網(wǎng)址生成二維碼圖片方法介紹
這篇文章介紹了C#實(shí)現(xiàn)將網(wǎng)址生成二維碼圖片的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04

