一、什么是定时器?
定时器(Timer)是编程中的一种工具,用于在指定的时间间隔内执行某个操作或代码段。它允许开发者在设定的时间周期后,自动触发特定事件或函数,从而实现定时任务、周期性操作或延迟执行等功能。
C#中的定时器主要包括System.Timers.Timer
、System.Threading.Timer
、System.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 后首次执行 | 可以立即执行,通过设置 dueTime 为 0 |
二、定时器的初始化
-
System.Timers.Timer
的初始化- 配置步骤(创建实例、设置
Interval
、注册Elapsed
事件等)。 - 使用
AutoReset
属性自动重置定时器。 - 可选设置:
SynchronizingObject
。
- 配置步骤(创建实例、设置
-
System.Threading.Timer
的初始化- 使用
TimerCallback
委托和状态对象(state
)初始化。 - 设置初始延迟时间和周期性时间间隔。
- 使用
-
System.Windows.Forms.Timer
的初始化- 专为 Windows Forms 应用设计的定时器。
- 在 UI 线程上直接初始化并关联
Tick
事件。
三、定时器的启动与停止
-
System.Timers.Timer
的启动与停止- 调用
Start
和Stop
方法控制定时器。 - 使用
Enabled
属性启停定时器。
- 调用
-
System.Threading.Timer
的启动与停止- 使用
Change
方法设置定时器的启停状态。 - 通过
Dispose
方法释放资源。
- 使用
-
System.Windows.Forms.Timer
的启动与停止- 使用
Start
和Stop
方法控制定时器。 - 通过
Enabled
属性启停定时器
- 使用
四、是否支持多线程
-
System.Timers.Timer
的多线程支持Elapsed
事件在独立的线程池线程上执行。- 如何避免多线程中的资源竞争。
-
System.Threading.Timer
的多线程支持- 本质上是多线程定时器,使用线程池执行回调。
state
对象如何在多线程环境中传递数据。
-
System.Windows.Forms.Timer
的多线程支持- 仅在 UI 线程上执行,不支持跨线程操作。
- 适用于简单的 UI 更新,不适合复杂的后台任务。
五、UI更新的简便性
-
System.Timers.Timer
的 UI 更新- 使用
SynchronizingObject
保证 UI 线程的安全更新。 - 使用
Invoke
或BeginInvoke
来跨线程更新 UI。
- 使用
-
System.Threading.Timer
的 UI 更新- 需要显式使用
Invoke
或BeginInvoke
更新 UI。 - 适用于复杂的后台任务,但需要谨慎处理 UI 线程。
- 需要显式使用
-
System.Windows.Forms.Timer
的 UI 更新- 天然适用于 UI 更新,
Tick
事件在 UI 线程上执行。 - 更新 UI 非常简便,不需要额外的线程安全处理。
- 天然适用于 UI 更新,
六、是否可能造成阻塞
-
System.Timers.Timer
的阻塞分析- 事件处理程序中的长时间操作可能阻塞当前事件,但不会影响定时器的下次触发。
-
System.Threading.Timer
的阻塞分析- 事件处理程序中的长时间操作可能阻塞当前事件,但不会影响定时器的下次触发。
-
System.Windows.Forms.Timer
的阻塞分析- 由于
Tick
事件在 UI 线程上执行,耗时操作可能会阻塞整个 UI 线程。
- 由于
七、是否立刻执行
-
System.Timers.Timer
的初次触发- 启动后等待
Interval
时间后第一次触发。
- 启动后等待
-
System.Threading.Timer
的初次触发- 可以通过设置初始延迟时间控制是否立刻执行。
-
System.Windows.Forms.Timer
的初次触发- 启动后等待
Interval
时间后第一次触发。
- 启动后等待
说明
本人专注机床的数据采集和程序传输,致力于机械加工行业的数字化系统开发
以下是自己开发的所支持的机床数据采集源代码类库(部分),