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