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

煙雲
发布: 2025-11-07 02:01:30
原创
890人浏览过
根据应用场景选择合适的定时器:控制台或服务使用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线程上。

ViiTor实时翻译
ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116
查看详情 ViiTor实时翻译

特点: 安全更新界面控件;精度较低(约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>();

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

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

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号