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

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
    }
}