新闻中心

C#怎么实现定时任务 C# Timer类的几种实现方式

2025-11-07
浏览次数:
返回列表
根据应用场景选择合适的定时器:控制台或服务使用System.Threading.Timer或System.Timers.Timer,Windows Forms使用Forms.Timer,ASP.NET Core推荐IHostedService结合Timer实现后台任务,注意线程安全、重入和资源释放。

c#怎么实现定时任务 c# timer类的几种实现方式

在C#中实现定时任务,常用的方式是使用Timer类。.NET提供了多种Timer实现,适用于不同场景。下面介绍几种常见的Timer类及其用法,帮助你在不同需求下选择合适的方案。

1. System.Threading.Timer

这是轻量级的定时器,运行在后台线程池线程上,适合执行简单的异步操作。

特点: 不依赖UI线程,不能直接更新界面控件;精度一般,适合后台任务。

  • 通过回调函数执行任务
  • 创建后自动开始,可设置首次触发延迟和周期
  • 需要持有引用,否则可能被垃圾回收

示例代码:

using System;
using System.Threading;

class Program
{
    private static Timer _timer;

    static void Main()
    {
        // 每2秒执行一次,首次延迟1秒
        _timer = new Timer(Callback, null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
        
        Console.WriteLine("按任意键退出...");
        Console.ReadKey();
    }

    static void Callback(object state)
    {
        Console.WriteLine($"Timer触发: {DateTime.Now}");
    }
}

2. System.Timers.Timer

这个Timer更易于使用,支持事件驱动模型,常用于服务或Windows Forms应用。

特点: 提供Elapsed事件;可设置AutoReset决定是否重复触发;支持SynchronizingObject用于跨线程访问UI。

  • Elapsed事件中处理任务逻辑
  • 建议在触发后检查是否仍在运行,避免重入
  • 使用Stop()或Close()释放资源

示例代码:

using System;
using System.Timers;

class Program
{
    static void Main()
    {
        var timer = new Timer(2000); // 2秒间隔
        timer.Elapsed += OnElapsed;
        timer.AutoReset = true; // 自动重复
        timer.Enabled = true;

        Console.WriteLine("按任意键退出...");
        Console.ReadKey();
    }

    static void OnElapsed(object source, ElapsedEventArgs e)
    {
        Console.WriteLine($"任务执行: {e.SignalTime}");
    }
}

3. System.Windows.Forms.Timer

专用于Windows Forms应用程序,运行在UI线程上。

刺鸟创客 刺鸟创客

一款专业高效稳定的AI内容创作平台

刺鸟创客 110 查看详情 刺鸟创客

特点: 安全更新界面控件;精度较低(约55ms);随窗体生命周期管理。

  • 只能在WinForms项目中使用
  • Tick事件在UI线程触发
  • 适合刷新界面、动画等场景

示例代码(WinForm中):

private Timer formTimer;

private void InitializeTimer()
{
    formTimer = new Timer();
    formTimer.Interval = 1000; // 1秒
    formTimer.Tick += FormTimer_Tick;
    formTimer.Start();
}

private void FormTimer_Tick(object sender, EventArgs e)
{
    label1.Text = DateTime.Now.ToString("HH:mm:ss");
}

4. ASP.NET中的定时任务(推荐:IHostedService + Timer)

在ASP.NET Core中,不推荐使用上述Timer长期运行任务,应使用后台服务。

推荐方式: 实现IHostedService接口,结合System.Threading.Timer。

优点: 支持依赖注入、优雅启停、集成日志等。

public class MyBackgroundService : IHostedService
{
    private Timer _timer;

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromMinutes(5));
        return Task.CompletedTask;
    }

    private void DoWork(object state)
    {
        Console.WriteLine("定时任务执行中...");
        // 可调用其他服务
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _timer?.Change(Timeout.Infinite, 0);
        return Task.CompletedTask;
    }
}

注册服务:services.AddHostedService<mybackgroundservice>();</mybackgroundservice>

基本上就这些。根据你的应用场景选择合适的Timer:控制台或服务用Threading.Timer或Timers.Timer,WinForm用Forms.Timer,ASP.NET用IHostedService封装Timer。关键注意线程安全、防止重入、及时释放资源。不复杂但容易忽略细节。

以上就是C#怎么实现定时任务 C# Timer类的几种实现方式的详细内容,更多请关注其它相关文章!


# windows  # go  # 个人wap网站建设  # 电商行业网站建设案例  # 刷关键词排名系统+s  # 新媒体营销推广心得  # 禁止营销和推广  # 邵东建设委员会网站查询  # 美食网站推广怎么做的  # 网站建设外包源代码  # 营销与推广技巧论文  # seo客服发展前景  # 意味着什么  # 开源  # 如何处理  # 这对  # 更有  # 微软  # 应用程序  # 首次  # 几种  # 回调  # .net  # c#  # win  # ai  # 回调函数 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】  Mac怎么使用表情符号_Mac Emoji快捷键面板  Golang如何实现状态模式管理对象状态_Golang State模式实现技巧  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  实现全屏滚动与导航点:专业教程  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  Django表单验证失败时保留用户输入数据的最佳实践  单射、满射与双射的关系 一文理清所有逻辑  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  J*aScript map 方法中处理循环元素为空数组的策略  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  Golang如何使用context实现超时取消_Golang context超时取消模式实践  优化Django表单:提交验证失败后保留用户输入  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问  sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  葱吃多了会怎样 葱吃多了会伤胃吗  FullCalendar 自定义按钮样式定制指南  MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具  SteamMachine定价或为699美元 大家想入手吗?  poki网页游戏推荐_poki免费游戏平台入口  Lar*el头像管理:图片缩放与旧文件删除的最佳实践  微博网页版官方账号登录 微博网页版内容浏览使用指南  小米汽车11月交付量突破40000台!雷军:将继续努力  解决Python单元测试中Mock异常方法调用计数为零的问题  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  漫蛙2正版漫画站 漫蛙2网页版快速访问入口  J*aScript中向JSON对象添加新属性的正确姿势  qq游戏跨平台入口_qq游戏多设备同步登录  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  微信网页版官方入口直达 微信网页版网页版登录使用方法  夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案  win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  在Pyomo中实现基于变量的条件约束:Big-M方法详解  机器学习中对数变换预测结果的反向还原  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  CSS Grid如何控制元素对齐_align-items与justify-items组合使用  电脑IP地址怎么查 查看本机IP地址的几种方法  Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择  蛙漫2台版漫画地址 Manwa2正版网页版链接  电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】 

搜索