parking-webapi/WebApi_data_value/Services/IHostedService.cs
2024-10-26 00:28:11 +08:00

71 lines
2.2 KiB
C#

using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using Parking_space_WebAPI.Services;
// 讓ExcelGenerationService執行每日固定存取
namespace Parking_space_WebAPI.BackgroundServices
{
public class DailyExcelGenerationService : IHostedService, IDisposable
{
private readonly ILogger<DailyExcelGenerationService> _logger;
private readonly IServiceProvider _serviceProvider;
private Timer _timer;
public DailyExcelGenerationService(ILogger<DailyExcelGenerationService> logger, IServiceProvider serviceProvider)
{
_logger = logger;
_serviceProvider = serviceProvider;
}
public Task StartAsync(CancellationToken cancellationToken)
{
TimeSpan scheduledTime = new TimeSpan(0, 23, 59); //設定固定每天存取的時間
var now = DateTime.Now;
var nextRunTime = DateTime.Today.Add(scheduledTime);
if (now > nextRunTime)
{
nextRunTime = nextRunTime.AddDays(1);
}
var timeToGo = nextRunTime - now;
_timer = new Timer(GenerateExcel, null, timeToGo, TimeSpan.FromDays(1));
return Task.CompletedTask;
}
private async void GenerateExcel(object state)
{
try
{
using (var scope = _serviceProvider.CreateScope())
{
var excelGenerationService = scope.ServiceProvider.GetRequiredService<ExcelGenerationService>();
await excelGenerationService.GenerateDailyExcel();
}
_logger.LogInformation("每日 Excel 檔案已生成。");
}
catch (Exception ex)
{
_logger.LogError(ex, "生成 Excel 檔案時出錯。");
}
}
public Task StopAsync(CancellationToken cancellationToken)
{
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
}