修复 Bug
This commit is contained in:
@@ -537,7 +537,7 @@ public abstract class BaseVideoSource : IVideoSource, IAsyncDisposable, IDeviceC
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[UIEventError] 设备 {Id} 状态回调异常: {ex.Message}");
|
||||
_sdkLog.Error(ex, "设备 {Id} 状态变更回调异常", Id);
|
||||
}
|
||||
|
||||
// 退出条件:取消令牌已触发 且 队列为空
|
||||
@@ -554,9 +554,10 @@ public abstract class BaseVideoSource : IVideoSource, IAsyncDisposable, IDeviceC
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (OperationCanceledException) { /* 正常退出 */ }
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[DistributorFatal] 设备 {Id} 状态分发器崩溃: {ex.Message}");
|
||||
_sdkLog.Fatal(ex, "设备 {Id} 状态分发器致命异常", Id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -670,31 +671,46 @@ public abstract class BaseVideoSource : IVideoSource, IAsyncDisposable, IDeviceC
|
||||
{
|
||||
// 防止重复 Dispose
|
||||
if (_isDisposed) return;
|
||||
_isDisposed = true;
|
||||
|
||||
// 1. 停止业务逻辑
|
||||
await StopAsync().ConfigureAwait(false);
|
||||
// Optimized: [原因] 获取生命周期锁,防止在 DisposeAsync 执行期间被并发触发 Start/Stop 操作
|
||||
await _lifecycleLock.WaitAsync().ConfigureAwait(false);
|
||||
|
||||
// 2. 优雅关闭状态分发器
|
||||
_statusQueue.Writer.TryComplete(); // 标记队列不再接受新消息
|
||||
_distributorCts?.Cancel(); // 触发分发器取消
|
||||
|
||||
// 3. 等待分发器处理完剩余消息(最多等待 500ms)
|
||||
if (_distributorTask != null)
|
||||
try
|
||||
{
|
||||
await Task.WhenAny(_distributorTask, Task.Delay(500)).ConfigureAwait(false);
|
||||
// 防止重复 Dispose
|
||||
if (_isDisposed) return;
|
||||
_isDisposed = true;
|
||||
|
||||
// 1. 停止业务逻辑
|
||||
await StopAsync().ConfigureAwait(false);
|
||||
|
||||
// 2. 优雅关闭状态分发器
|
||||
_statusQueue.Writer.TryComplete(); // 标记队列不再接受新消息
|
||||
_distributorCts?.Cancel(); // 触发分发器取消
|
||||
|
||||
// 3. 等待分发器处理完剩余消息(最多等待 500ms)
|
||||
if (_distributorTask != null)
|
||||
{
|
||||
await Task.WhenAny(_distributorTask, Task.Delay(500)).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
// 4. 切断事件引用,防止内存泄漏
|
||||
FrameReceived = null;
|
||||
StatusChanged = null;
|
||||
|
||||
// 5. 释放基础资源
|
||||
_lifecycleLock.Dispose();
|
||||
_distributorCts?.Dispose();
|
||||
}
|
||||
finally
|
||||
{
|
||||
// Modified: [原因] 保证计数锁在任何情况下都能释放
|
||||
if (!_isDisposed)
|
||||
_lifecycleLock.Release();
|
||||
|
||||
// 4. 切断事件引用,防止内存泄漏
|
||||
FrameReceived = null;
|
||||
StatusChanged = null;
|
||||
|
||||
// 5. 释放基础资源
|
||||
_lifecycleLock.Dispose();
|
||||
_distributorCts?.Dispose();
|
||||
|
||||
// 6. 抑制垃圾回收器的终结器
|
||||
GC.SuppressFinalize(this);
|
||||
// 6. 抑制垃圾回收器的终结器
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
Reference in New Issue
Block a user