namespace DramaLing.Api.Services; public class CacheCleanupService : BackgroundService { private readonly IServiceProvider _serviceProvider; private readonly ILogger _logger; private readonly TimeSpan _cleanupInterval = TimeSpan.FromHours(1); // 每小時清理一次 public CacheCleanupService(IServiceProvider serviceProvider, ILogger 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(); _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"); } }