修复在线导致的一个 Bug
This commit is contained in:
@@ -12,8 +12,26 @@
|
||||
/// <para>✅ [Bug π] 管道安全:Dispose 采用优雅关闭策略,确保剩余状态消息被消费</para>
|
||||
/// <para>✅ [编译修复] 补全 CloneConfig 中 Transport/VendorArguments 的深拷贝逻辑</para>
|
||||
/// </summary>
|
||||
public abstract class BaseVideoSource : IVideoSource, IAsyncDisposable
|
||||
public abstract class BaseVideoSource : IVideoSource, IAsyncDisposable, IDeviceConnectivity
|
||||
{
|
||||
// [新增] 物理在线状态(专门给 Ping 使用)
|
||||
private volatile bool _isPhysicalOnline;
|
||||
public bool IsPhysicalOnline => _isPhysicalOnline;
|
||||
|
||||
string IDeviceConnectivity.IpAddress => _config.IpAddress;
|
||||
|
||||
// 允许哨兵从外部更新 _isOnline 字段
|
||||
void IDeviceConnectivity.SetNetworkStatus(bool isOnline)
|
||||
{
|
||||
if (_isPhysicalOnline != isOnline)
|
||||
{
|
||||
_isPhysicalOnline = isOnline;
|
||||
// 触发状态变更是为了通知 UI 更新绿色小圆点,但不改变 Status
|
||||
// 注意:这里传 _status 保持原样,只变消息
|
||||
StatusChanged?.Invoke(this, new StatusChangedEventArgs(_status, isOnline ? "物理网络恢复" : "物理网络中断"));
|
||||
}
|
||||
}
|
||||
|
||||
#region --- 1. 核心配置与锁机制 (Core Config & Locks) ---
|
||||
|
||||
/// <summary>
|
||||
@@ -256,13 +274,17 @@ public abstract class BaseVideoSource : IVideoSource, IAsyncDisposable
|
||||
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(15));
|
||||
await OnStartAsync(cts.Token).ConfigureAwait(false);
|
||||
|
||||
// ============================================================
|
||||
// 【核心修复位置】
|
||||
// 赋予心跳 5 秒的宽限期 (Grace Period)
|
||||
// 这样 Coordinator 在未来 5 秒内计算出来的无帧时间将是负数或极小值,不会触发复位
|
||||
// ============================================================
|
||||
Interlocked.Exchange(ref _lastFrameTick, Environment.TickCount64 + 5000);
|
||||
|
||||
// 标记运行状态
|
||||
_isOnline = true;
|
||||
IsRunning = true;
|
||||
|
||||
// 初始化心跳:给予 2 秒宽限期,防止刚启动被判定为僵死
|
||||
Interlocked.Exchange(ref _lastFrameTick, Environment.TickCount64 + 2000);
|
||||
|
||||
// 更新状态为播放中,并刷新元数据
|
||||
UpdateStatus(VideoSourceStatus.Playing, "流传输正常运行");
|
||||
await RefreshMetadataAsync().ConfigureAwait(false);
|
||||
|
||||
Reference in New Issue
Block a user