using Microsoft.Extensions.Options; using QMax.Api.Configuration; namespace QMax.Api.Services; public sealed class MaxSyncWorker( IOptions options, MaxBridgeSyncService syncService, ILogger logger) : BackgroundService { private readonly QMaxOptions _options = options.Value; protected override async Task ExecuteAsync(CancellationToken stoppingToken) { var delay = TimeSpan.FromSeconds(Math.Max(3, _options.MaxPollIntervalSeconds)); using var timer = new PeriodicTimer(delay); while (!stoppingToken.IsCancellationRequested) { try { await syncService.SyncOnceAsync(stoppingToken); } catch (Exception ex) { logger.LogWarning(ex, "QMAX background sync tick failed."); } try { await timer.WaitForNextTickAsync(stoppingToken); } catch (OperationCanceledException) { break; } } } }