c# 实现每个整数分钟执行一次的定时任务

StartAsync 方法中,计算了下一个整数分钟的时间,然后使用 System.Threading.Timer 类创建定时器,并将首次触发时间设为该时间。在 InsertDB2Async 方法中,我们定义了要执行的操作,然后使用 await Task.Delay(1000) 模拟异步操作的等待时间。最后,我们重新计算下一个整数分钟的时间,并使用 Change 方法设置定时器的下一次触发时间。

需要注意的是,InsertDB2Async 方法是异步方法,但是我们使用的是 async void 定义方法。在实际应用中,应该使用 async Task 定义异步方法,以避免出现无法捕获的异常。另外,System.Threading.Timer 类的回调方法是在另一个线程上执行的,因此在操作期间需要注意线程安全。

cs 复制代码
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;

public class MyTimerHostedService : IHostedService, IDisposable
{
    private Timer _timer;

    public Task StartAsync(CancellationToken cancellationToken)
    {
        // 计算下一个整分钟的时间,并设置定时器的首次触发时间
        var now = DateTime.Now;
        var nextMinute = now.AddMinutes(1);
        var target = nextMinute.AddSeconds(-nextMinute.Second);
        var delay = (int)(target - now).TotalMilliseconds;
        _timer = new Timer(InsertDB2Async, null, delay, 60000);
        return Task.CompletedTask;
    }

    private async void InsertDB2Async(object state)
    {
        try
        {
            // 在这里写你要执行的代码
            Console.WriteLine($"[{DateTime.Now}] Hello, world!");
            // 等待异步操作完成
            await Task.Delay(1000);
        }
        finally
        {
            // 计算下一个整分钟的时间,并设置定时器的下一次触发时间
            var now = DateTime.Now;
            var nextMinute = now.AddMinutes(1);
            var target = nextMinute.AddSeconds(-nextMinute.Second);
            var delay = (int)(target - now).TotalMilliseconds;
            _timer.Change(delay, 60000);
        }
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _timer.Dispose();
        return Task.CompletedTask;
    }

    public void Dispose()
    {
        _timer.Dispose();
    }
}
相关推荐
公子小六3 小时前
基于.NET的Windows窗体编程之WinForms数据持久化(1)
windows·microsoft·c#·.net·winforms
三雷科技4 小时前
第6章第4节:自定义分词器
开发语言·c#
zhanghaha13145 小时前
C# 系列教程_12 字符串 string 保姆级系统教程(面向新手,大量示例 + 原理讲解)
开发语言·数据库·c#
Coder_Shenshen20 小时前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
寂寞的船1 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene
1-1=01 天前
C# 数据结构和特殊类型
数据结构·c#·.net·.netcore
波力海苔夹心脆6753 天前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
AI导出鸭PC端3 天前
Perplexity批量导出没有PDF模式?AI导出鸭插件补上最后一块拼图
人工智能·pdf·c#·ai导出鸭
Risehuxyc3 天前
C# 选用更流行的语言版本
c#
淡海水4 天前
09-04-内存-Unity原生对象生命周期
unity·c#·游戏引擎·gc