using ChromeboxFanControl; namespace ChromeboxFanControlService; public sealed class FanControlWorker : BackgroundService { private FanController? _fan; private AppConfig? _config; protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _config = AppConfig.LoadMerged(); _fan = new FanController(_config); _fan.Start(); try { await Task.Delay(Timeout.Infinite, stoppingToken); } catch (OperationCanceledException) { /* shutdown */ } } public override async Task StopAsync(CancellationToken cancellationToken) { _fan?.Stop(); _fan?.Dispose(); if (_config != null) { try { EctoolRunner.RunSync(_config.EctoolPath, _config.AutoFanCtrlArgs); } catch { /* best effort restore autofan on shutdown */ } } await base.StopAsync(cancellationToken); } }