using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace Admin.NET.Plugin.AiDOP.DataPlatform.HotWatch; /// 热回读后台:默认每 5 秒一轮,Concurrent 由单实例循环保证不叠加。 public sealed class MdpHotWatchWorker : BackgroundService { private static readonly TimeSpan Interval = TimeSpan.FromSeconds(5); private readonly IServiceScopeFactory _scopeFactory; private readonly ILogger _logger; public MdpHotWatchWorker(IServiceScopeFactory scopeFactory, ILoggerFactory loggerFactory) { _scopeFactory = scopeFactory; _logger = loggerFactory.CreateLogger(nameof(MdpHotWatchWorker)); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { // 启动稍延后,避免与应用引导抢资源 try { await Task.Delay(TimeSpan.FromSeconds(15), stoppingToken); } catch (OperationCanceledException) { return; } while (!stoppingToken.IsCancellationRequested) { try { using var scope = _scopeFactory.CreateScope(); var svc = scope.ServiceProvider.GetRequiredService(); var (polled, changed, terminated) = await svc.PollOnceAsync(100, stoppingToken); if (changed + terminated > 0) _logger.LogInformation( "[MdpHotWatchWorker] polled={Polled} changed={Changed} terminated={Terminated}", polled, changed, terminated); } catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested) { break; } catch (Exception ex) { _logger.LogWarning(ex, "[MdpHotWatchWorker] poll failed"); } try { await Task.Delay(Interval, stoppingToken); } catch (OperationCanceledException) { break; } } } }