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 编辑过