dramaling-vocab-learning/backend/DramaLing.Api/Services/CacheCleanupService.cs

47 lines
1.7 KiB
C#

namespace DramaLing.Api.Services;
public class CacheCleanupService : BackgroundService
{
private readonly IServiceProvider _serviceProvider;
private readonly ILogger<CacheCleanupService> _logger;
private readonly TimeSpan _cleanupInterval = TimeSpan.FromHours(1); // 每小時清理一次
public CacheCleanupService(IServiceProvider serviceProvider, ILogger<CacheCleanupService> logger)
{
_serviceProvider = serviceProvider;
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("Cache cleanup service started");
while (!stoppingToken.IsCancellationRequested)
{
try
{
using var scope = _serviceProvider.CreateScope();
var cacheService = scope.ServiceProvider.GetRequiredService<IAnalysisCacheService>();
_logger.LogInformation("Starting cache cleanup...");
await cacheService.CleanExpiredCacheAsync();
_logger.LogInformation("Cache cleanup completed");
await Task.Delay(_cleanupInterval, stoppingToken);
}
catch (OperationCanceledException)
{
// 正常的服務停止
break;
}
catch (Exception ex)
{
_logger.LogError(ex, "Error during cache cleanup");
// 出錯時等待較短時間後重試
await Task.Delay(TimeSpan.FromMinutes(5), stoppingToken);
}
}
_logger.LogInformation("Cache cleanup service stopped");
}
}