当前位置: 首页 > article >正文

System.Threading.Timer 和 System.Timers.Timer

在 .NET 中,System.Threading.Timer 和 System.Timers.Timer 都是用于定时任务的类,但它们的实现方式、使用场景和特性有所不同。以下是它们的 核心区别 和 使用示例


1. System.Threading.Timer

特点

  • 轻量级,基于线程池,适合高性能后台任务。

  • 无事件机制,通过回调函数触发。

  • 手动控制 启动/停止(通过 Change 方法)。

  • 不直接支持 UI 操作(需手动切换线程)。

基本用法

using System;
using System.Threading;class Program
{static void Main(){// 创建定时器(回调函数,状态对象,初始延迟,间隔)var timer = new Timer(callback: state => Console.WriteLine($"触发时间: {DateTime.Now:T}"),state: null,dueTime: 1000,    // 1秒后首次触发period: 2000       // 之后每2秒触发一次);Console.ReadLine();timer.Dispose(); // 释放资源}
}

关键方法

  • Change(dueTime, period):动态调整定时器(如暂停或重启)。

  • Dispose():释放定时器。


2. System.Timers.Timer

特点

  • 基于事件Elapsed 事件),代码更易读。

  • 支持自动重置AutoReset 属性控制是否循环)。

  • 可绑定到 UI 线程(通过 SynchronizingObject,仅 WinForms)。

  • 适合需要事件机制的场景(如 UI 定时更新)。

基本用法

using System;
using System.Timers;class Program
{static void Main(){var timer = new System.Timers.Timer(interval: 1000); // 1秒间隔timer.Elapsed += (sender, e) => Console.WriteLine($"触发时间: {e.SignalTime:T}");timer.AutoReset = true; // 是否循环触发timer.Start();Console.ReadLine();timer.Stop();}
}

关键属性/方法

  • Interval:定时间隔(毫秒)。

  • AutoResettrue 为循环触发,false 为单次触发。

  • Start() / Stop():启停定时器。


3. 核心区别对比

特性System.Threading.TimerSystem.Timers.Timer
命名空间System.ThreadingSystem.Timers
触发方式回调函数Elapsed 事件
线程模型线程池线程默认线程池,可通过 SynchronizingObject 绑定到 UI 线程(WinForms)
控制方法Change() 动态调整Start() / Stop()
是否自动循环由 period 参数决定由 AutoReset 属性控制
适用场景高性能后台任务事件驱动任务(如 UI 更新)
资源释放需显式调用 Dispose()调用 Stop() 或 Dispose()

4. 如何选择?

使用 System.Threading.Timer 当:

  • 需要 轻量级、高性能 的后台轮询(如心跳检测)。

  • 不需要直接操作 UI。

  • 需要 灵活调整定时间隔(通过 Change 方法)。

使用 System.Timers.Timer 当:

  • 需要 事件驱动 的代码结构(更易维护)。

  • 在 WinForms 中更新 UI(通过 SynchronizingObject)。

  • 需要 简单的启停控制Start() / Stop())。


5. 注意事项

共同点

  • 默认在 后台线程 触发,直接操作 UI 会抛跨线程异常。

    • WPF 需用 Dispatcher.Invoke

    • WinForms 可用 Control.Invoke 或 SynchronizingObject(仅 System.Timers.Timer 支持)。

System.Threading.Timer 的陷阱

  • 回调中抛出异常会导致定时器 静默停止(需手动捕获异常)。

  • 如果 period 设为 Timeout.Infinite,则只触发一次。

System.Timers.Timer 的陷阱

  • 忘记设置 AutoReset = false 会导致无限循环。

  • 不调用 Stop() 可能导致资源泄漏。


6. 完整示例(含 UI 操作)

WPF 中使用 System.Timers.Timer 更新 UI

// MainWindow.xaml.cs
using System.Timers;
using System.Windows;public partial class MainWindow : Window
{private readonly System.Timers.Timer _timer;public MainWindow(){InitializeComponent();_timer = new System.Timers.Timer(1000);_timer.Elapsed += OnTimerElapsed;_timer.Start();}private void OnTimerElapsed(object sender, ElapsedEventArgs e){// 必须通过 Dispatcher 更新 UIDispatcher.Invoke(() => {TimeLabel.Content = $"当前时间: {e.SignalTime:T}";});}protected override void OnClosed(EventArgs e){_timer?.Dispose();base.OnClosed(e);}
}

控制台中使用 System.Threading.Timer

using System;
using System.Threading;class Program
{static void Main(){var timer = new Timer(state => Console.WriteLine($"后台执行: {DateTime.Now:T}"),null,dueTime: 0,period: 2000);Console.ReadLine();timer.Dispose();}
}

总结

  • 简单后台轮询 → System.Threading.Timer(更高效)。

  • 事件驱动/UI 操作 → System.Timers.Timer(更易用)。

  • 始终记得释放资源Dispose() 或 Stop())。

http://www.lryc.cn/news/2399248.html

相关文章:

  • 在 Windows 系统下配置 VSCode + CMake + Ninja 进行 C++ 或 Qt 开发
  • `tokenizer.decode` 出现乱码或异常输出,怎么处理
  • 几何绘图与三角函数计算应用
  • leetcode 二叉搜索树中第k小的元素 java
  • 5.1 初探大数据流式处理
  • 基于 Android 和 JBox2D 的简单小游戏
  • 传输层协议 UDP 介绍 -- UDP 协议格式,UDP 的特点,UDP 的缓冲区
  • Python try-except-else 语句详解
  • ApacheSuperset CVE-2023-27524
  • Windows Server部署Vue3+Spring Boot项目
  • malloc 是如何分配内存的?——C 语言内存分配详解
  • Opencl
  • 如何在 HTML 中添加按钮
  • 【优秀三方库研读】quill 开源库中的命名空间为什么要用宏封装
  • AlphaFold3运行错误及解决方法(1)
  • Linux--进程的程序替换
  • 调教 DeepSeek - 输出精致的 HTML MARKDOWN
  • 【笔记】Windows系统部署suna基于 MSYS2的Poetry 虚拟环境backedn后端包编译失败处理
  • GQA(Grouped Query Attention):分组注意力机制的原理与实践《一》
  • 【深度学习优化算法】02:凸性
  • JAVA国际版一对一视频交友视频聊天系统源码支持H5+APP
  • 策略公开了:年化494%,夏普比率5.86,最大回撤7% | 大模型查询akshare,附代码
  • 【C++】string类的模拟实现(详解)
  • 业界宽松内存模型的不统一而导致的软件问题, gcc, linux kernel, JVM
  • 多模态大语言模型arxiv论文略读(101)
  • 量化Quantization初步之--带量化(QAT)的XOR异或pyTorch版250501
  • Linux Maven Install
  • #Java篇:学习node后端之sql常用操作
  • 电网“逆流”怎么办?如何实现分布式光伏发电全部自发自用?
  • 如何查看电脑电池性能