using var timer = new PeriodicTimer(TimeSpan.FromSeconds(10)); while (await timer.WaitForNextTickAsync()) { // 堆代码 www.duidaima.com //Business logic }这样就可以每隔 10 秒执行一次操作。
2.在回调的执行过程中,我们可以阻止下一次回调的执行,直到我们完成了当前的操作。
using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Hosting; namespace ConsoleApp1 { public class DatabaseCheckService : BackgroundService { protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { // 堆代码 www.duidaima.com Console.WriteLine("Checking database..."); // 检查数据库代码 await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken); } } } class Program { static void Main(string[] args) { var host = new HostBuilder() .ConfigureServices((hostContext, services) => { services.AddHostedService<DatabaseCheckService>(); }) .Build(); host.Run(); } } }在这个例子中,我们继承了 BackgroundService 类并重写了 ExecuteAsync 方法。ExecuteAsync 方法会在后台服务启动时被调用,并在参数 stoppingToken 被取消时退出。我们在 while 循环中使用 Task.Delay 方法来等待 5 秒,并在每次循环中调用检查数据库的代码。
using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace ConsoleApp1 { public class DatabaseCheckService : BackgroundService { protected override async Task ExecuteAsync(CancellationToken stoppingToken) { using var timer = new PeriodicTimer(TimeSpan.FromSeconds(10)); while (!stoppingToken.IsCancellationRequested) { if (await timer.WaitForNextTickAsync(stoppingToken)) { Console.WriteLine("Checking database..."); // 检查数据库代码 } } } } class Program { static void Main(string[] args) { var host = new HostBuilder() .ConfigureServices((hostContext, services) => { services.AddHostedService<DatabaseCheckService>(); }) .Build(); host.Run(); } } }