You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3.9 KiB
3.9 KiB
Dispose.cs (自动转换为Markdown)
// 以下内容为原始C#代码,含详细注释
// 文件原路径:Managers/WebSocketMgr/Dispose.cs
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WebSocket4Net;
namespace CoreAgent.ProtocolClient.Managers.WebSocketMgr
{
public partial class WebSocketMessageManager
{
#region IDisposable实现
/// <summary>
/// 释放资源 - 对应LTEClientWebSocket.Dispose()方法
///
/// 功能说明:
/// 1. 释放WebSocket连接和相关资源
/// 2. 清理消息队列和定时器
/// 3. 设置释放标志,防止重复释放
/// 4. 调用MessageIdManager的Dispose方法
///
/// 对应关系:
/// - 资源释放:对应原始实现中的Dispose()方法
/// - 连接关闭:对应原始实现中的WebSocket关闭逻辑
/// - 定时器清理:对应原始实现中的定时器释放逻辑
/// - 队列清理:对应原始实现中的队列清理逻辑
/// - 释放标志:对应原始实现中的_disposed设置
/// - 日志记录:对应原始实现中的释放日志记录
///
/// 重构改进:
/// - 更清晰的资源释放顺序
/// - 更完善的异常处理
/// - 更详细的日志记录
/// - 保持了完全一致的释放逻辑
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// 释放资源的受保护方法 - 实现标准的Dispose模式
///
/// 功能说明:
/// 1. 实现标准的Dispose模式,支持手动释放和垃圾回收
/// 2. 确保资源只被释放一次
/// 3. 按照正确的顺序释放资源
///
/// 对应关系:
/// - 释放模式:对应.NET标准的Dispose模式
/// - 资源清理:对应原始实现中的资源清理逻辑
/// - 异常处理:对应原始实现中的异常处理
///
/// 重构改进:
/// - 标准的Dispose模式实现
/// - 更安全的资源管理
/// - 更好的异常处理
/// - 保持了完全一致的清理逻辑
/// </summary>
/// <param name="disposing">是否为手动释放</param>
protected virtual void Dispose(bool disposing)
{
if (_disposed)
return;
if (disposing)
{
try
{
_logger.LogInformation($"[{_clientName}] 释放WebSocket消息管理器资源");
// 停止消息发送定时器 - 对应原始实现中的定时器释放
StopMessageDeferTimer();
// 清空消息队列 - 对应原始实现中的队列清理
ClearMessageQueue();
// 释放BlockingCollection资源 - 优化:确保BlockingCollection正确释放
_messageFifo?.Dispose();
// 关闭WebSocket连接 - 对应原始实现中的WebSocket关闭
if (_webSocket != null)
{
_webSocket.Close();
_webSocket = null;
}
// 释放MessageIdManager - 对应原始实现中的相关资源释放
_messageIdManager?.Dispose();
}
catch (Exception ex)
{
_logger.LogError(ex, $"[{_clientName}] 释放资源异常: {ex.Message}");
}
}
_disposed = true;
}
#endregion
}
}