C#中定时器之System.Timers.Timer

System.Timers.Timer 是 .NET 框架中用于创建基于时间间隔的定时器类,它属于 System.Timers 命名空间。这个定时器类设计用于多线程环境中的服务器或服务组件,没有用户界面,在运行时不可见。

核心特性

‌事件驱动模型‌: System.Timers.Timer 通过 Elapsed 事件来通知定时器已经过了指定的时间间隔。当定时器到达设定的时间间隔时,会引发 Elapsed 事件。
‌多线程执行‌: 该定时器在 ThreadPool 线程上运行,适用于后台任务处理。它可以在一定时间间隔内重复执行任务。
‌自动重置功能‌: 通过 AutoReset 属性控制是否重复触发事件。当 AutoReset 设置为 true 时,定时器会持续重复执行;设置为 false 时,只在第一次时间间隔后触发一次。

主要属性

● ‌Interval‌:设置定时器触发事件的时间间隔(单位为毫秒)

● ‌AutoReset‌:控制定时器是否重复触发事件

● ‌Enabled‌:控制定时器是否启用

使用示例

案例代码

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using Timer = System.Timers.Timer;

namespace ConsoleTest
{
    internal class Program
    {
        private static Timer backgroundTimer;
        private static int taskCounter = 0;
        private static bool isRunning = false;

        static void Main(string[] args)
        {
            Console.WriteLine("System.Timers.Timer 使用案例");
            Console.WriteLine("============================");

            // 创建定时器,每3秒执行一次
            backgroundTimer = new Timer(3000);
            backgroundTimer.Elapsed += OnTimerElapsed;
            backgroundTimer.AutoReset = true;

            // 启动定时器
            backgroundTimer.Enabled = true;
            isRunning = true;

            Console.WriteLine("定时器已启动,每3秒执行一次后台任务");
            Console.WriteLine("输入 'stop' 停止定时器,输入 'exit' 退出程序");

            while (true)
            {
                string input = Console.ReadLine();
                if (input?.ToLower() == "stop")
                {
                    StopTimer();
                }
                else if (input?.ToLower() == "exit")
                {
                    break;
                }
            }

            // 清理资源
            StopTimer();
            backgroundTimer.Dispose();
            Console.WriteLine("程序结束");
        }

        private static void OnTimerElapsed(object source, ElapsedEventArgs e)
        {
            taskCounter++;
            Console.WriteLine($"[后台任务 {taskCounter}] 执行时间: {e.SignalTime:yyyy-MM-dd HH:mm:ss}");

            // 模拟一些后台工作
            PerformBackgroundWork();
        }

        private static void PerformBackgroundWork()
        {
            try
            {
                // 模拟耗时操作
                Thread.Sleep(1000);
                Console.WriteLine($"[后台任务 {taskCounter}] 工作完成");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"[错误] 后台任务执行出错: {ex.Message}");
            }
        }

        private static void StopTimer()
        {
            if (isRunning)
            {
                backgroundTimer.Enabled = false;
                isRunning = false;
                Console.WriteLine("定时器已停止");
            }
        }
    }
}

与其他定时器的区别

System.Timers.Timer 与 System.Threading.Timer 和 System.Windows.Forms.Timer 相比,具有以下特点:

● ‌System.Timers.Timer‌: 定期触发事件,类旨在用作多线程环境中的基于服务器或服务组件;它没有用户界面,在运行时不可见(不可以直接更新UI界面)

● ‌System.Threading.Timer‌: 定期在线程池线程上执行单个回调方法(不可以直接更新UI界面)

● ‌System.Windows.Forms.Timer‌: 一种 Windows 窗体组件,按固定时间间隔触发事件(可以直接更新UI界面)

相关推荐
郝学胜_神的一滴9 小时前
C++11 工程级应用 12:编译期类型魔法,干掉重复与臃肿的代码
c++·visual studio
水饺编程12 小时前
第5章,[Win32 章节] :在平面直角坐标系中描点
c语言·c++·windows·visual studio
XiaoZhenHua9813 小时前
C#工业机器视觉Recipe配方系统设计:多型号、多相机、多工位参数如何统一管理
c#·软件架构·机器视觉·工业自动化·工业软件·recipe
fujisheng66114 小时前
FUI 导航实践:拆开 Layer、History、Coverage 与 Cache 的组合语义
c#·unity3d
郝学胜_神的一滴15 小时前
C++11 工程级应用 11:编译期黑魔法,告别重复烂代码
c++·visual studio
淡海水16 小时前
10-05-高级-模式匹配-CSharp如何改变与数据结构的交互方式
数据结构·算法·c#·模式匹配
XiaoZhenHua9817 小时前
C# WinForms + 西门子S7 + SQLite + EPPlus生产数据采集系统架构设计
系统架构·sqlite·c#
Lost of 程序猿17 小时前
船岸数据同步链路实战:SendFlag、单调版本号与断网三天后的续传
后端·c#·asp.net
VIP_CQCRE18 小时前
Visual Studio 也能接入 AI 编程:用 Ace Data Cloud 快速配置 LMLocal
openai·ai编程·visual studio·ace data cloud
an86950011 天前
unity如何在visual studio中打断点debug
unity·游戏引擎·visual studio