using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using VSH.Services;
namespace VSH.BackgroundServices;
///
/// This service is not really necessary, but it is nice to have for future reference.
/// The job that this service is doing, could maybe become an http endpoint?
///
public class AssetsCleanupBackgroundService : BackgroundService
{
private readonly IServiceProvider _serviceProvider;
private readonly ILogger _logger;
private static TimeSpan CleanupInterval => TimeSpan.FromSeconds(10);
public AssetsCleanupBackgroundService(
IServiceProvider serviceProvider,
ILogger logger
) {
_serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
await StartInternalAsync(stoppingToken);
}
private async Task StartInternalAsync(CancellationToken cancellationToken) {
while (true) {
if (cancellationToken.IsCancellationRequested) {
_logger.LogDebug("CancellationRequested... Exiting");
break;
}
try {
await Task.Delay(CleanupInterval, cancellationToken);
} catch (TaskCanceledException) {
_logger.LogDebug("TaskCanceledException... Exiting");
break;
} catch (Exception ex) {
_logger.LogError($"Task.Delay exception: {ex.Message}. Exiting.");
break;
}
if (cancellationToken.IsCancellationRequested) {
_logger.LogDebug("CancellationRequested... Exiting");
break;
}
using var serviceProvider = _serviceProvider.CreateScope();
var assetsService = serviceProvider.ServiceProvider.GetRequiredService();
await assetsService.RemoveUnusedProductImages();
}
}
}