1秒后首次触发,之后每2秒触发一次
using System.Threading;
class Program{ static void Main() { var timer = new Timer( callback: state => Console.WriteLine($"触发时间: {DateTime.Now:T}"), state: null, dueTime: 1000, period: 2000 );
Console.ReadLine(); timer.Dispose(); }}
轻量级,基于线程池,适合高性能后台任务。
无事件机制,通过回调函数触发。
手动控制 启动/停止(通过 Change 方法)。
不直接支持 UI 操作(需手动切换线程)。
二、 System.Timers.Timer
间隔1秒执行一次
using System.Timers;
class Program{ static void Main() { var timer = new System.Timers.Timer(interval: 1000); timer.Elapsed += (sender, e) => Console.WriteLine($"触发时间: {e.SignalTime:T}"); timer.AutoReset = true; timer.Start();
Console.ReadLine(); timer.Stop(); }}
每天23点59分59秒执行一次任务
using System.Timers;
class DailyTask{ static Timer timer; static void Main() { SetTimer(); Console.WriteLine("定时服务已启动..."); }
static void SetTimer() { var now = DateTime.Now; var target = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59); if (now > target) target = target.AddDays(1);
timer = new Timer((target - now).TotalMilliseconds); timer.Elapsed += (s,e) => { Console.WriteLine($"{DateTime.Now} 执行每日任务");
timer.Interval = TimeSpan.FromDays(1).TotalMilliseconds; }; timer.Start(); }}
基于事件(Elapsed 事件),代码更易读。
支持自动重置(AutoReset 属性控制是否循环)。
可绑定到 UI 线程(通过 SynchronizingObject,仅 WinForms)。
适合需要事件机制的场景(如 UI 定时更新)。
三、using System.Windows.Threading
using System.Windows.Threading;
public partial class MainWindow : Window { private DispatcherTimer _timer; public MainWindow() { InitializeComponent(); _timer = new DispatcherTimer(); _timer.Interval = TimeSpan.FromSeconds(1); _timer.Tick += (s, e) => lblTime.Content = DateTime.Now.ToString("HH:mm:ss"); _timer.Start(); }}
DispatcherTimer必须在UI线程创建
默认Interval为1秒更新
MVVM模式需实现INotifyPropertyChanged接口
两种实现方式各有适用场景,MVVM更适合复杂业务
注意避免直接在其他线程修改UI元素,这是选择DispatcherTimer而非System.Timers.Timer的主要原因。如需动态调整间隔时间,可通过修改Interval属性实现
四、using System.Threading.Tasks;
using System.Threading.Tasks;
public void UploadTimer(){ Task.Run(async () => {while (IsTurnOnOk) {try { Test();
await Task.Delay(5000); }catch (Exception ex) { } } });}
支持 async/await 语法糖
提供任务取消(CancellationToken)
支持任务延续(ContinueWith)
并行任务处理(Task.WhenAll/WhenAny)
与DispatcherTimer的区别:
Tasks 是通用的异步编程模型
DispatcherTimer 专为UI线程定时器设计
Tasks 不自动关联UI线程上下文
阅读原文:原文链接
该文章在 2025/6/17 13:49:24 编辑过