根据应用场景选择合适的定时器:控制台或服务使用System.Threading.Timer或System.Timers.Timer,Windows Forms使用Forms.Timer,ASP.NET Core推荐IHostedService结合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线程上。
特点: 安全更新界面控件;精度较低(约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();
基本上就这些。根据你的应用场景选择合适的Timer:控制台或服务用Threading.Timer或Timers.Timer,WinForm用Forms.Timer,ASP.NET用IHostedService封装Timer。关键注意线程安全、防止重入、及时释放资源。不复杂但容易忽略细节。
以上就是C#怎么实现定时任务 C# Timer类的几种实现方式的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1441368.html
微信扫一扫
支付宝扫一扫