using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace JiShe.CollectBus.Common.WorkService { /// /// 系统后台定时服务 /// public abstract class SystemBackGroundWorkService : BackgroundService { /// /// 日志记录 /// public ILogger Logger { get; set; } /// /// 创建一个取消标记源 /// private readonly CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); /// /// 任务执行间隔时间 /// private TimeSpan interval; protected SystemBackGroundWorkService(ILogger logger) { Logger = logger; interval = GetInterval(); } /// /// 执行时间间隔 /// /// protected abstract TimeSpan GetInterval(); protected override async Task ExecuteAsync(CancellationToken stoppingToken) { await Task.CompletedTask;// 等待其他任务执行完成,避免阻塞应用程序启动 // Logger.LogInformation($"任务每隔{interval.TotalSeconds}秒执行一次"); await InitAsync(cancellationTokenSource.Token); } protected virtual async Task InitAsync(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { try { await DoWorkAsync(cancellationToken); } catch (Exception ex) { Logger.LogError(ex, "后台任务执行发生异常"); } await Task.Delay(interval, cancellationToken); } } public override Task StopAsync(CancellationToken cancellationToken) { Logger.LogInformation("后台服务停止……"); cancellationTokenSource.Cancel(); return Task.CompletedTask; } /// /// 抛出方法入口以便于其服务实现 /// /// /// protected abstract Task DoWorkAsync(CancellationToken cancellationToken); } }