namespace RoslynBridge.WebApi.Services; /// /// Background service that periodically removes stale VS instances /// public class InstanceCleanupService : BackgroundService { private readonly IServiceProvider _serviceProvider; private readonly ILogger _logger; private readonly TimeSpan _cleanupInterval = TimeSpan.FromMinutes(1); private readonly TimeSpan _staleTimeout = TimeSpan.FromMinutes(5); public InstanceCleanupService( IServiceProvider serviceProvider, ILogger logger) { _serviceProvider = serviceProvider; _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("Instance cleanup service started"); while (!stoppingToken.IsCancellationRequested) { try { await Task.Delay(_cleanupInterval, stoppingToken); // Get the registry service from scope using var scope = _serviceProvider.CreateScope(); var registryService = scope.ServiceProvider.GetRequiredService(); registryService.RemoveStaleInstances(_staleTimeout); } catch (OperationCanceledException) { // Expected when stopping break; } catch (Exception ex) { _logger.LogError(ex, "Error during instance cleanup"); } } _logger.LogInformation("Instance cleanup service stopped"); } }