优化温度数据接收逻辑:实现一次建连持续接收模式
This commit is contained in:
@@ -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,37 +1153,22 @@ 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)
|
||||
{
|
||||
// 如果暂停,则Sleep 1秒后继续
|
||||
Log("接收状态为false且处于暂停状态,等待1秒后继续");
|
||||
Thread.Sleep(LONG_SLEEP_MS);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 否则同步创建tcp连接
|
||||
Log("接收状态为false且未暂停,创建TCP连接");
|
||||
|
||||
// 清理之前的连接
|
||||
// 清理之前可能存在的连接资源
|
||||
try
|
||||
{
|
||||
if (localStream != null)
|
||||
@@ -1204,6 +1189,11 @@ namespace JoyD.Windows.CS.Toprie
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
// 如果接收状态为true
|
||||
if (isReceiving && localTcpClient != null && localStream != null && localTcpClient.Connected)
|
||||
// 连接失败后等待一段时间再重试
|
||||
Thread.Sleep(LONG_SLEEP_MS);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// 数据接收处理:使用已建立的连接持续接收数据
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user