.NET中的6种定时器的基本用法和特点 |
.NET中至少有6种定时器,每一种定时器都有它的用途和特点 。根据定时器的应用场景,可以分为UI相关的定时器和UI无关的定时器 。本文将简单介绍这6种定时器的基本用法和特点 。 UI定时器.NET中的UI定时器主要是WinForm、WPF以及WebForm中的定时器 。分别为:
通常情况下,WinForm、WPF中的定时器是在UI线程上执行回调函数,因此可以直接访问UI元素 。由于WinForm、WPF支持单线程单元模型(Single-Thread Apartment,STA),定时器间隔事件是在UI线程上触发,因此,不用担心线程安全问题 。
System.Windows.Forms.Timer
public partial class TimerFrom : Form { private System.Windows.Forms.Timer digitalClock; private void TimerFrom_Load(object sender, EventArgs e) { digitalClock = new System.Windows.Forms.Timer();//创建定时器 digitalClock.Tick += new EventHandler(HandleTime);//注册定时任务事件 digitalClock.Interval = 1000;//设置时间间隔 digitalClock.Enabled = true; digitalClock.Start(); //开启定时器 } public void HandleTime(Object myObject, EventArgs myEventArgs) { labelClock.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } private void frmTimerDemo_FormClosed(object sender, FormClosedEventArgs e) { digitalClock.Stop();//停止定时器 digitalClock.Dispose(); } } System.Windows.Threading.DispatcherTimer
此外, private void Dt_Tick(object sender, EventArgs e) { Dispatcher.BeginInvoke((Action)delegate () { text1.Text = DateTime.Now.ToString(); }); Console.WriteLine(DateTime.Now.ToString()); } private void Button_Click(object sender, RoutedEventArgs e) { Task.Run(() =>{ DispatcherTimer dt = new DispatcherTimer(); dt.Tick += Dt_Tick; dt.Interval = TimeSpan.FromSeconds(1); dt.Start(); Dispatcher.Run(); }); } 上述代码中, System.Web.UI.Timer
UI无关定时器从 .NET 6开始,UI无关定时器有三个:
System.Threading.Timer
var stateTimer = new var autoEvent = new AutoResetEvent(false); Timer(CheckStatus, autoEvent, 1000,250); private int invokeCount=0; public void CheckStatus(Object stateInfo) { AutoResetEvent autoEvent = (AutoResetEvent)stateInfo; Console.WriteLine("{0} Checking status {1,2}.",DateTime.Now.ToString("h:mm:ss.fff"),(++invokeCount).ToString()); if(invokeCount == 10) { invokeCount = 0; autoEvent.Set(); } } System.Timers.Timer
public partial class TimerFrom : Form { private System.Timers.Timer timer; private void TimerFrom_Load(object sender, EventArgs e) { // 支持注册多个处理程序 timer.Elapsed += (sender, e) => { label1.Text = DateTime.Now.ToLongTimeString(); }; timer.Elapsed += (sender, e) => { Console.WriteLine(DateTime.Now.ToLongTimeString()); }; //自定义回调执行的方式(指定对象所在的线程),SynchronizingObject=null时在线程池上执行 timer.SynchronizingObject = this; timer.AutoReset = true; timer.Start(); } } 本例中将 System.Threading.PeriodicTimer
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(15)); using (var timer = new PeriodicTimer(TimeSpan.FromSeconds(1))) { try { while (await timer.WaitForNextTickAsync(cts.Token)) { await Task.Delay(3000); Console.WriteLine($"ThreadId is {Thread.CurrentThread.ManagedThreadId} --- Time is {DateTime.Now:HH:mm:ss}"); } } catch (OperationCanceledException) { Console.WriteLine("Operation cancelled"); } } 小结我们在开发过程中遇到的坑往往不是技术本身的坑,而是我们滥用没有掌握的技术导致的,在有多种技术方案可选的时候,通常只关注技术的优点,忽略了技术适用场景及其局限性 。.NET中几种定时器各自都有其适用场景和不足,但都不支持高精度计时 。了解这些有助于我们在开发过程中选择合适定时器,避免遇到问题后被动地替换解决方案 。
到此这篇关于.NET中有多少种定时器的文章就介绍到这了,更多相关.NET定时器内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持! |