2026-01-16 07:23:56 +08:00
|
|
|
|
using Ayay.SerilogLogs;
|
|
|
|
|
|
using Microsoft.Extensions.Hosting;
|
|
|
|
|
|
using Serilog;
|
2026-01-07 10:59:03 +08:00
|
|
|
|
using SHH.CameraSdk;
|
|
|
|
|
|
|
2026-01-16 07:23:56 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 设备管理服务引擎 Worker
|
|
|
|
|
|
/// </summary>
|
2026-01-07 10:59:03 +08:00
|
|
|
|
public class CameraEngineWorker : BackgroundService
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly CameraManager _manager;
|
|
|
|
|
|
|
|
|
|
|
|
public CameraEngineWorker(CameraManager manager)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 理由:严谨性检查,防止因配置错误导致的空指针崩溃
|
|
|
|
|
|
_manager = manager ?? throw new ArgumentNullException(nameof(manager));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
|
|
|
|
|
{
|
2026-01-16 07:23:56 +08:00
|
|
|
|
var sysLog = Log.ForContext("SourceContext", LogModules.Core);
|
|
|
|
|
|
sysLog.Information("[Engine] 正在启动设备管理服务引擎...");
|
2026-01-07 10:59:03 +08:00
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
// 1. 理由:启动 SDK 内部加载流程(从本地存储恢复设备)
|
|
|
|
|
|
await _manager.StartAsync();
|
2026-01-16 07:23:56 +08:00
|
|
|
|
sysLog.Warning("[Engine] 设备管理服务引擎已启动...");
|
2026-01-07 10:59:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
2026-01-16 07:23:56 +08:00
|
|
|
|
sysLog.Error($"[Engine] 设备管理服务引擎启动异常: {ex.Message}");
|
2026-01-07 10:59:03 +08:00
|
|
|
|
return; // 理由:核心组件失败,终止后续逻辑
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 理由:Worker 必须保持活跃状态,以便作为宿主生命周期的一部分
|
|
|
|
|
|
while (!stoppingToken.IsCancellationRequested)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 你可以在这里定期输出一些状态统计
|
2026-01-16 07:23:56 +08:00
|
|
|
|
sysLog.Debug($"[Engine] 管理设备数: {_manager.GetAllCameras().Count()}");
|
2026-01-07 10:59:03 +08:00
|
|
|
|
await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override async Task StopAsync(CancellationToken cancellationToken)
|
|
|
|
|
|
{
|
2026-01-16 07:23:56 +08:00
|
|
|
|
var sysLog = Log.ForContext("SourceContext", LogModules.Core);
|
|
|
|
|
|
sysLog.Debug($"[Engine] 正在执行优雅停机: {_manager.GetAllCameras()}");
|
2026-01-07 10:59:03 +08:00
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
// 理由:这是重构的核心。必须在 SDK 退出前释放所有非托管句柄
|
|
|
|
|
|
await _manager.DisposeAsync();
|
|
|
|
|
|
}
|
|
|
|
|
|
finally
|
|
|
|
|
|
{
|
|
|
|
|
|
await base.StopAsync(cancellationToken);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|