47 lines
1.7 KiB
C#
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");
|
|
}
|
|
} |