62 lines
2.0 KiB
C#
62 lines
2.0 KiB
C#
using Microsoft.Extensions.Hosting;
|
||
|
||
namespace Service;
|
||
|
||
/// <summary>
|
||
/// 周期性账单后台服务
|
||
/// </summary>
|
||
public class PeriodicBillBackgroundService(
|
||
IServiceProvider serviceProvider,
|
||
ILogger<PeriodicBillBackgroundService> logger
|
||
) : BackgroundService
|
||
{
|
||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||
{
|
||
logger.LogInformation("周期性账单后台服务已启动");
|
||
|
||
while (!stoppingToken.IsCancellationRequested)
|
||
{
|
||
try
|
||
{
|
||
var now = DateTime.Now;
|
||
|
||
// 计算下次执行时间(每天早上6点)
|
||
var nextRun = now.Date.AddHours(6);
|
||
if (now >= nextRun)
|
||
{
|
||
nextRun = nextRun.AddDays(1);
|
||
}
|
||
|
||
var delay = nextRun - now;
|
||
logger.LogInformation("下次执行周期性账单检查时间: {NextRun}, 延迟: {Delay}",
|
||
nextRun.ToString("yyyy-MM-dd HH:mm:ss"), delay);
|
||
|
||
await Task.Delay(delay, stoppingToken);
|
||
|
||
if (stoppingToken.IsCancellationRequested)
|
||
break;
|
||
|
||
// 执行周期性账单检查
|
||
using (var scope = serviceProvider.CreateScope())
|
||
{
|
||
var periodicService = scope.ServiceProvider.GetRequiredService<ITransactionPeriodicService>();
|
||
await periodicService.ExecutePeriodicBillsAsync();
|
||
}
|
||
}
|
||
catch (OperationCanceledException)
|
||
{
|
||
logger.LogInformation("周期性账单后台服务已取消");
|
||
break;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
logger.LogError(ex, "周期性账单后台服务执行出错");
|
||
// 出错后等待1小时再重试
|
||
await Task.Delay(TimeSpan.FromHours(1), stoppingToken);
|
||
}
|
||
}
|
||
|
||
logger.LogInformation("周期性账单后台服务已停止");
|
||
}
|
||
}
|