c#设置定时器,在一定时间之后自动执行事件

public static void SetTimeOut(double interval, Action action)
        {
            System.Timers.Timer timer = new System.Timers.Timer(interval);//实例化Timer类,设置间隔时间;
            timer.Elapsed += new System.Timers.ElapsedEventHandler(delegate (object sender, System.Timers.ElapsedEventArgs e)
            {
                timer.Enabled = false;
                action();
            });//到达时间的时候执行事件;
            timer.AutoReset = false;//设置是执行一次(false)还是一直执行(true);
            timer.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
        }

timer.Interval:设置时间间隔,也可以通过实例化Timer类,设置时间间隔;
action:要执行的表达式;
Elapsed:执行事件;
Enabled:是否执行System.Timers.Timer.Elapsed事件;
AutoReset:设置为false,执行一次,true,一直执行。

### 创建每5分钟触发一次的Windows服务定时器 要在C#中创建一个每5分钟触发一次的Windows服务定时器,可以使用 `System.Timers.Timer` 类来实现这一功能。以下是具体的实现方式: #### 使用 `System.Timers.Timer` 通过配置 `Interval` 属性为 300000 毫秒(即 5 分钟),并设置 `AutoReset` 属性为 `true` 来确保每次计时结束后自动重置定时器。 ```csharp using System; using System.ServiceProcess; using System.Timers; public class MyService : ServiceBase { private Timer _timer; public MyService() { InitializeComponent(); } protected override void OnStart(string[] args) { // 初始化定时器 _timer = new Timer(300000); // 设置间隔时间为 5 分钟 (300 秒 × 1000 毫秒/秒)[^1] _timer.Elapsed += new ElapsedEventHandler(TimerElapsed); _timer.AutoReset = true; // 自动重置以便多次触发[^4] _timer.Enabled = true; // 启用定时器 _timer.Start(); // 开始计时 } private void TimerElapsed(object sender, ElapsedEventArgs e) { // 执行的任务逻辑 ServerStart(e.SignalTime.ToString()); // 调用任务处理方法[^1] } private void ServerStart(string time) { // 这里编写实际业务逻辑 Console.WriteLine($"Task executed at {time}"); } protected override void OnStop() { // 停止定时器 _timer.Stop(); _timer.Dispose(); } } ``` 上述代码展示了如何在 Windows 服务中集成一个每 5 分钟触发一次的定时器,并调用指定的方法完成特定任务。 --- #### 另一种方案:基于整数分钟触发 如果希望更精确地控制定时器,在每个整数分钟执行任务,则可以根据当前时间动态调整第一次触发时间和后续周期性触发行为[^3]。 ```csharp private async Task StartAsync() { DateTime now = DateTime.Now; TimeSpan spanToNextMinute = new TimeSpan(0, 0, 60 - now.Second, 0, 0); var firstTriggerAt = now.Add(spanToNextMinute); double dueTimeMs = spanToNextMinute.TotalMilliseconds; using (var timer = new System.Threading.Timer(async state => { await InsertDB2Async(); // 计算下一次触发时间 DateTime nextTriggerAt = DateTime.Now.AddMinutes(5); long periodMs = TimeSpan.FromMinutes(5).TotalMilliseconds; timer.Change(periodMs, Timeout.Infinite); }, null, dueTimeMs, Timeout.Infinite)) { while (!stoppingToken.IsCancellationRequested) { await Task.Delay(TimeSpan.FromSeconds(1)); } } } private async Task InsertDB2Async() { try { // 插入数据库或其他操作 Console.WriteLine("Executing task..."); await Task.Delay(1000); // 模拟异步操作延迟 } catch (Exception ex) { Console.WriteLine(ex.Message); } } ``` 此代码片段利用了 `System.Threading.Timer` 的灵活性,能够更加精准地安排首次触发时刻以及之后每隔 5 分钟的一次触发。 --- ### 总结 无论是采用 `System.Timers.Timer` 或者 `System.Threading.Timer` 都能很好地满足需求,具体选择取决于项目场景和个人偏好。前者更适合简单的定期回调场景;后者则提供了更高的精度和更大的自由度用于复杂调度逻辑的设计。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值