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}");
}
}
});
}
}