using YY.Admin.Core; namespace YY.Admin.Services.Service; /// /// 胶料快检相关 MES 只读数据(实验标准、密炼计划)专用轮询管理器。 /// public class MesQuickTestDataPollManager : ISingletonDependency { public static readonly TimeSpan PollInterval = TimeSpan.FromSeconds(2); private readonly List<(string Name, Func Task)> _tasks = []; private readonly Timer _timer; private readonly ILoggerService _logger; private volatile bool _tickRunning; public MesQuickTestDataPollManager(ILoggerService logger) { _logger = logger; _timer = new Timer(OnTick, null, PollInterval, PollInterval); _logger.Information($"[快检数据轮询] 已启动,间隔 {PollInterval.TotalSeconds} 秒"); } public void Register(string name, Func pollTask) { lock (_tasks) _tasks.Add((name, pollTask)); _logger.Information($"[快检数据轮询] 注册任务: {name}"); } private void OnTick(object? _) { if (_tickRunning) return; _ = Task.Run(async () => { if (_tickRunning) return; _tickRunning = true; try { List<(string Name, Func Task)> snapshot; lock (_tasks) snapshot = [.. _tasks]; foreach (var (name, task) in snapshot) { try { await task().ConfigureAwait(false); } catch (Exception ex) { _logger.Warning($"[快检数据轮询] 任务 [{name}] 异常: {ex.Message}"); } } } finally { _tickRunning = false; } }); } }