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