From 2ba884311b4ef8ee8fd3b805635de1d40601dd88 Mon Sep 17 00:00:00 2001 From: zqm Date: Mon, 3 Nov 2025 08:45:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B8=A9=E5=BA=A6=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=8E=A5=E6=94=B6=E9=80=BB=E8=BE=91=EF=BC=9A=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E4=B8=80=E6=AC=A1=E5=BB=BA=E8=BF=9E=E6=8C=81=E7=BB=AD?= =?UTF-8?q?=E6=8E=A5=E6=94=B6=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Toprie/Toprie/DeviceManager.cs | 118 ++++++++++-------- 1 file changed, 67 insertions(+), 51 deletions(-) diff --git a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs index 5096e7c..2ba8082 100644 --- a/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs +++ b/Windows/CS/Framework4.0/Toprie/Toprie/DeviceManager.cs @@ -1122,13 +1122,13 @@ namespace JoyD.Windows.CS.Toprie { Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] ReceiveTemperatureDataWithTcp() - 开始执行"); - // 使用局部变量存储资源,减少对全局变量的依赖 + // 使用局部变量存储资源 TcpClient localTcpClient = null; NetworkStream localStream = null; List temperatureDataAccumulator = new List(); byte[] buffer = new byte[65536]; // 缓冲区大小 - // 定义常量,避免魔法数字 + // 定义常量 const int RECEIVE_TIMEOUT = 5000; const int SHORT_SLEEP_MS = 10; const int MEDIUM_SLEEP_MS = 50; @@ -1153,57 +1153,47 @@ namespace JoyD.Windows.CS.Toprie break; } - // 获取当前接收状态、暂停状态和设备IP - bool isReceiving = false; + // 获取当前状态和配置 bool isPaused = false; string deviceIp = null; int temperaturePort = 0; lock (_lockObject) { - isReceiving = _isReceivingTemperatureData; isPaused = _isTemperatureReceivingPaused; deviceIp = _deviceIp; temperaturePort = TEMPERATURE_TCP_PORT; } - // 根据用户要求的逻辑处理 - if (!isReceiving) + // 连接管理:仅当连接不存在或已断开时才创建新连接 + if (localTcpClient == null || !localTcpClient.Connected || localStream == null) { - // 如果接收状态为false - if (isPaused) + // 清理之前可能存在的连接资源 + try { - // 如果暂停,则Sleep 1秒后继续 - Log("接收状态为false且处于暂停状态,等待1秒后继续"); - Thread.Sleep(LONG_SLEEP_MS); - continue; + if (localStream != null) + { + localStream.Close(); + localStream = null; + } + if (localTcpClient != null) + { + localTcpClient.Close(); + localTcpClient = null; + } } - else + catch (Exception ex) { - // 否则同步创建tcp连接 - Log("接收状态为false且未暂停,创建TCP连接"); - - // 清理之前的连接 - try - { - if (localStream != null) - { - localStream.Close(); - localStream = null; - } - if (localTcpClient != null) - { - localTcpClient.Close(); - localTcpClient = null; - } - } - catch (Exception ex) - { - Log($"关闭旧连接异常: {ex.Message}"); - } - - try + Log($"关闭旧连接异常: {ex.Message}"); + } + + try + { + // 只有在未暂停状态下才创建连接 + if (!isPaused) { + Log("创建新的温度数据TCP连接..."); + // 创建TCP客户端并连接 localTcpClient = new TcpClient { @@ -1219,7 +1209,7 @@ namespace JoyD.Windows.CS.Toprie localStream = localTcpClient.GetStream(); localStream.ReadTimeout = RECEIVE_TIMEOUT; - // 只更新必要的状态标志 + // 更新状态标志 lock (_lockObject) { _isReceivingTemperatureData = true; @@ -1230,25 +1220,43 @@ namespace JoyD.Windows.CS.Toprie localStream.Write(startCommand, 0, startCommand.Length); localStream.Flush(); Log("已发送开始温度数据传输命令"); - - // 更新局部状态标志 - isReceiving = true; } - catch (Exception ex) + else { - Log($"TCP连接或初始化失败: {ex.Message}"); - // 连接失败后等待1秒再重试 + // 暂停状态下短暂等待后重试 + Log("处于暂停状态,等待后重试连接"); Thread.Sleep(LONG_SLEEP_MS); continue; } } + catch (Exception ex) + { + Log($"TCP连接或初始化失败: {ex.Message}"); + + // 更新状态标志 + lock (_lockObject) + { + _isReceivingTemperatureData = false; + } + + // 连接失败后等待一段时间再重试 + Thread.Sleep(LONG_SLEEP_MS); + continue; + } } - // 如果接收状态为true - if (isReceiving && localTcpClient != null && localStream != null && localTcpClient.Connected) + // 数据接收处理:使用已建立的连接持续接收数据 + if (localTcpClient != null && localTcpClient.Connected && localStream != null) { try { + // 更新状态标志 + lock (_lockObject) + { + _isReceivingTemperatureData = true; + } + + // 检查流是否有数据可读 if (localStream.DataAvailable) { // 读取数据 @@ -1259,14 +1267,14 @@ namespace JoyD.Windows.CS.Toprie Array.Copy(buffer, receivedBytes, bytesRead); Log($"接收到温度数据字节数: {bytesRead}"); - // 如果暂停,接收后丢弃 + // 根据暂停状态决定是否处理数据 if (isPaused) { - Log("接收状态为true但处于暂停状态,数据已接收但丢弃"); + Log("处于暂停状态,数据已接收但丢弃"); } else { - // 否则同步接收并处理数据 + // 同步接收并处理数据 lock (temperatureDataAccumulator) { temperatureDataAccumulator.AddRange(receivedBytes); @@ -1278,10 +1286,13 @@ namespace JoyD.Windows.CS.Toprie { // 连接已关闭 Log("远程主机关闭了连接"); + + // 重置状态标志,下一次循环会创建新连接 lock (_lockObject) { _isReceivingTemperatureData = false; } + // 清理连接资源 try { @@ -1289,6 +1300,7 @@ namespace JoyD.Windows.CS.Toprie localTcpClient.Close(); } catch {} + localStream = null; localTcpClient = null; continue; @@ -1303,11 +1315,13 @@ namespace JoyD.Windows.CS.Toprie catch (Exception ex) { Log($"接收数据异常: {ex.Message}"); - // 连接异常,重置状态准备重连 + + // 更新状态标志 lock (_lockObject) { _isReceivingTemperatureData = false; } + // 清理连接资源 try { @@ -1315,9 +1329,11 @@ namespace JoyD.Windows.CS.Toprie localTcpClient.Close(); } catch {} + localStream = null; localTcpClient = null; - // 短暂休眠后重试 + + // 异常后等待一段时间再重试 Thread.Sleep(ERROR_SLEEP_MS); } }