using YY.Admin.Core; namespace YY.Admin.Services.Service; /// /// 统一后台轮询管理器。 /// 各模块通过 注册轮询任务,定时器统一触发。 /// ★ 只需修改 即可调整所有模块的轮询间隔。 /// public class SyncPollManager : ISingletonDependency { // ★ 唯一轮询间隔配置 — 修改这里即可调整所有模块的轮询频率 public static readonly TimeSpan PollInterval = TimeSpan.FromMinutes(5); private readonly List<(string Name, Func Task)> _tasks = []; private readonly Timer _timer; private readonly ILoggerService _logger; public SyncPollManager(ILoggerService logger) { _logger = logger; // 首次延迟一个完整周期,确保所有协调器启动后都已完成注册 _timer = new Timer(OnTick, null, PollInterval, PollInterval); _logger.Information($"[轮询管理器] 已启动,间隔 {PollInterval.TotalMinutes} 分钟"); } /// 注册一个需要定时执行的轮询任务 /// 任务名称,用于日志 /// 异步轮询委托 public void Register(string name, Func pollTask) { lock (_tasks) _tasks.Add((name, pollTask)); _logger.Information($"[轮询管理器] 注册任务: {name}"); } private void OnTick(object? _) { _ = Task.Run(async () => { List<(string Name, Func Task)> snapshot; lock (_tasks) snapshot = [.. _tasks]; _logger.Debug($"[轮询管理器] 触发,执行 {snapshot.Count} 个任务"); foreach (var (name, task) in snapshot) { try { await task().ConfigureAwait(false); } catch (Exception ex) { _logger.Warning($"[轮询管理器] 任务 [{name}] 异常: {ex.Message}"); } } }); } }