优化温度数据接收逻辑:实现一次建连持续接收模式

This commit is contained in:
zqm
2025-11-03 08:45:14 +08:00
parent 540a9e7b8a
commit 2ba884311b

View File

@@ -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<byte> temperatureDataAccumulator = new List<byte>();
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);
}
}