82 lines
2.5 KiB
C#
82 lines
2.5 KiB
C#
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
|
|
{
|
|
/// <summary>
|
|
/// 系统后台定时服务
|
|
/// </summary>
|
|
public abstract class SystemBackGroundWorkService : BackgroundService
|
|
{
|
|
/// <summary>
|
|
/// 日志记录
|
|
/// </summary>
|
|
public ILogger<SystemBackGroundWorkService> Logger { get; set; }
|
|
|
|
/// <summary>
|
|
/// 创建一个取消标记源
|
|
/// </summary>
|
|
private readonly CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
|
|
|
|
/// <summary>
|
|
/// 任务执行间隔时间
|
|
/// </summary>
|
|
private TimeSpan interval;
|
|
|
|
protected SystemBackGroundWorkService(ILogger<SystemBackGroundWorkService> logger)
|
|
{
|
|
Logger = logger;
|
|
interval = GetInterval();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 执行时间间隔
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 抛出方法入口以便于其服务实现
|
|
/// </summary>
|
|
/// <param name="cancellationToken"></param>
|
|
/// <returns></returns>
|
|
protected abstract Task DoWorkAsync(CancellationToken cancellationToken);
|
|
}
|
|
}
|