C# 定时器的深入解析:从初始化到性能优化的全面分析

一、什么是定时器?

          定时器(Timer)是编程中的一种工具,用于在指定的时间间隔内执行某个操作或代码段。它允许开发者在设定的时间周期后,自动触发特定事件或函数,从而实现定时任务、周期性操作或延迟执行等功能。

       C#中的定时器主要包括System.Timers.TimerSystem.Threading.TimerSystem.Windows.Forms.Timer

       本文将从初始化,定时器的启停,是否是多线程,UI更新,是否造成堵塞,是否立刻执行等角度分析。

特性

System.Windows

.Forms.Timer

System.Timers.Timer

System.Threading.

Timer

初始化简单,适合UI应用适用于一般定时任务适合复杂后台任务,需要回调函数
启动与停止使用 Start()Stop()使用 Start()Stop()通过 Change() 启动和停止
是否多线程否,运行在UI线程是,多线程运行,事件可能在后台线程触发是,多线程运行,始终在后台线程上
UI更新无需额外处理,直接更新UI需要使用 Invoke 更新UI需要使用 Invoke 更新UI
是否阻塞可能阻塞UI线程可能阻塞后台线程,不影响UI线程可能阻塞线程池线程,不影响UI线程
是否立即执行否,等待 Interval 后首次执行否,等待 Interval 后首次执行可以立即执行,通过设置 dueTime0

二、定时器的初始化

  • System.Timers.Timer 的初始化

    • 配置步骤(创建实例、设置 Interval、注册 Elapsed 事件等)。
    • 使用 AutoReset 属性自动重置定时器。
    • 可选设置:SynchronizingObject
  • System.Threading.Timer 的初始化

    • 使用 TimerCallback 委托和状态对象(state)初始化。
    • 设置初始延迟时间和周期性时间间隔。
  • System.Windows.Forms.Timer 的初始化

    • 专为 Windows Forms 应用设计的定时器。
    • 在 UI 线程上直接初始化并关联 Tick 事件。

三、定时器的启动与停止

  1. System.Timers.Timer 的启动与停止

    • 调用 StartStop 方法控制定时器。
    • 使用 Enabled 属性启停定时器。
  2. System.Threading.Timer 的启动与停止

    • 使用 Change 方法设置定时器的启停状态。
    • 通过 Dispose 方法释放资源。
  3. System.Windows.Forms.Timer 的启动与停止

    • 使用 StartStop 方法控制定时器。
    • 通过 Enabled 属性启停定时器

四、是否支持多线程

  1. System.Timers.Timer 的多线程支持

    • Elapsed 事件在独立的线程池线程上执行。
    • 如何避免多线程中的资源竞争。
  2. System.Threading.Timer 的多线程支持

    • 本质上是多线程定时器,使用线程池执行回调。
    • state 对象如何在多线程环境中传递数据。
  3. System.Windows.Forms.Timer 的多线程支持

    • 仅在 UI 线程上执行,不支持跨线程操作。
    • 适用于简单的 UI 更新,不适合复杂的后台任务。

五、UI更新的简便性

  1. System.Timers.Timer 的 UI 更新

    • 使用 SynchronizingObject 保证 UI 线程的安全更新。
    • 使用 InvokeBeginInvoke 来跨线程更新 UI。
  2. System.Threading.Timer 的 UI 更新

    • 需要显式使用 InvokeBeginInvoke 更新 UI。
    • 适用于复杂的后台任务,但需要谨慎处理 UI 线程。
  3. System.Windows.Forms.Timer 的 UI 更新

    • 天然适用于 UI 更新,Tick 事件在 UI 线程上执行。
    • 更新 UI 非常简便,不需要额外的线程安全处理。

六、是否可能造成阻塞

  1. System.Timers.Timer 的阻塞分析

    • 事件处理程序中的长时间操作可能阻塞当前事件,但不会影响定时器的下次触发。
  2. System.Threading.Timer 的阻塞分析

    • 事件处理程序中的长时间操作可能阻塞当前事件,但不会影响定时器的下次触发。
  3. System.Windows.Forms.Timer 的阻塞分析

    • 由于 Tick 事件在 UI 线程上执行,耗时操作可能会阻塞整个 UI 线程。

七、是否立刻执行

  1. System.Timers.Timer 的初次触发

    • 启动后等待 Interval 时间后第一次触发。
  2. System.Threading.Timer 的初次触发

    • 可以通过设置初始延迟时间控制是否立刻执行。
  3. System.Windows.Forms.Timer 的初次触发

    • 启动后等待 Interval 时间后第一次触发。

说明

本人专注机床的数据采集和程序传输,致力于机械加工行业的数字化系统开发

以下是自己开发的所支持的机床数据采集源代码类库(部分),

  • 21
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值