修复 Bug

This commit is contained in:
2026-01-17 13:13:17 +08:00
parent a27045e0a0
commit 8482996a94
10 changed files with 177 additions and 59 deletions

View File

@@ -29,7 +29,8 @@ public class CameraCoordinator
private readonly SemaphoreSlim _concurrencyLimiter = new(8);
/// <summary> 相机流存活判定阈值(秒):超过该时间无帧则判定为流中断 </summary>
private const int StreamAliveThresholdSeconds = 5;
/// 海康 SDK 建立连接+首帧到达通常需 4-8 秒。阈值低了会导致刚连上就被误判为僵死而强制断开。
private const int StreamAliveThresholdSeconds = 15;
/// <summary> Ping 探测超时时间(毫秒) </summary>
private const int PingTimeoutMs = 800;
@@ -162,7 +163,7 @@ public class CameraCoordinator
double secondsSinceLastFrame = (nowTick - cam.LastFrameTick) / 1000.0;
// 2. 判定流是否正常:设备在线 + 5秒内有帧
// 2. 判定流是否正常:设备在线 + 15秒内有帧
bool isFlowing = cam.IsActived && secondsSinceLastFrame < StreamAliveThresholdSeconds;
// 3. 判定物理连接是否正常:流正常则直接判定在线;否则执行 Ping+TCP 探测
@@ -185,6 +186,7 @@ public class CameraCoordinator
// 双重校验:防止等待锁期间状态已变更
if (!cam.IsActived)
{
// 记录启动时刻elapsed 将重新计时
cam.MarkStartAttempt();
try
@@ -224,8 +226,20 @@ public class CameraCoordinator
// 【关键修复】:增加了 && cam.IsRunning 判定,防止待机状态下被误复位
else if (isPhysicalOk && cam.IsActived && !isFlowing && cam.IsRunning) // [cite: 504]
{
_sysLog.Warning($"[Coordinator] [自愈] 设备 {cam.Id} 僵死({secondsSinceLastFrame:F1}秒无帧),复位中...");
await cam.StopAsync().ConfigureAwait(false);
// Optimized: [修复无限重启] 增加“启动保护期”检查。
// 原问题:相机刚 StartAsync 还在握手例如第3秒isFlowing 为 false会导致立即被 Stop。
// 新逻辑:只有当“启动已超过 15秒”且“依然没流”时才判定为真正的僵死。
// elapsed 是毫秒StreamAliveThresholdSeconds 是秒,需要换算
if (elapsed > StreamAliveThresholdSeconds * 1000)
{
_sysLog.Warning($"[Coordinator] [自愈] 设备 {cam.Id} 僵死({secondsSinceLastFrame:F1}秒无帧),复位中...");
await cam.StopAsync().ConfigureAwait(false);
}
else
{
_sysLog.Debug($"[Coordinator] 设备 {cam.Id} 启动握手中 ({elapsed}ms),等待出流...");
}
}
}