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);
}
}