优化温度数据接收逻辑:实现一次建连持续接收模式
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() - 开始执行");
|
Log($"[{DateTime.Now:HH:mm:ss.fff}] [线程:{Thread.CurrentThread.ManagedThreadId}] ReceiveTemperatureDataWithTcp() - 开始执行");
|
||||||
|
|
||||||
// 使用局部变量存储资源,减少对全局变量的依赖
|
// 使用局部变量存储资源
|
||||||
TcpClient localTcpClient = null;
|
TcpClient localTcpClient = null;
|
||||||
NetworkStream localStream = null;
|
NetworkStream localStream = null;
|
||||||
List<byte> temperatureDataAccumulator = new List<byte>();
|
List<byte> temperatureDataAccumulator = new List<byte>();
|
||||||
byte[] buffer = new byte[65536]; // 缓冲区大小
|
byte[] buffer = new byte[65536]; // 缓冲区大小
|
||||||
|
|
||||||
// 定义常量,避免魔法数字
|
// 定义常量
|
||||||
const int RECEIVE_TIMEOUT = 5000;
|
const int RECEIVE_TIMEOUT = 5000;
|
||||||
const int SHORT_SLEEP_MS = 10;
|
const int SHORT_SLEEP_MS = 10;
|
||||||
const int MEDIUM_SLEEP_MS = 50;
|
const int MEDIUM_SLEEP_MS = 50;
|
||||||
@@ -1153,57 +1153,47 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取当前接收状态、暂停状态和设备IP
|
// 获取当前状态和配置
|
||||||
bool isReceiving = false;
|
|
||||||
bool isPaused = false;
|
bool isPaused = false;
|
||||||
string deviceIp = null;
|
string deviceIp = null;
|
||||||
int temperaturePort = 0;
|
int temperaturePort = 0;
|
||||||
|
|
||||||
lock (_lockObject)
|
lock (_lockObject)
|
||||||
{
|
{
|
||||||
isReceiving = _isReceivingTemperatureData;
|
|
||||||
isPaused = _isTemperatureReceivingPaused;
|
isPaused = _isTemperatureReceivingPaused;
|
||||||
deviceIp = _deviceIp;
|
deviceIp = _deviceIp;
|
||||||
temperaturePort = TEMPERATURE_TCP_PORT;
|
temperaturePort = TEMPERATURE_TCP_PORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据用户要求的逻辑处理
|
// 连接管理:仅当连接不存在或已断开时才创建新连接
|
||||||
if (!isReceiving)
|
if (localTcpClient == null || !localTcpClient.Connected || localStream == null)
|
||||||
{
|
{
|
||||||
// 如果接收状态为false
|
// 清理之前可能存在的连接资源
|
||||||
if (isPaused)
|
try
|
||||||
{
|
{
|
||||||
// 如果暂停,则Sleep 1秒后继续
|
if (localStream != null)
|
||||||
Log("接收状态为false且处于暂停状态,等待1秒后继续");
|
{
|
||||||
Thread.Sleep(LONG_SLEEP_MS);
|
localStream.Close();
|
||||||
continue;
|
localStream = null;
|
||||||
|
}
|
||||||
|
if (localTcpClient != null)
|
||||||
|
{
|
||||||
|
localTcpClient.Close();
|
||||||
|
localTcpClient = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
// 否则同步创建tcp连接
|
Log($"关闭旧连接异常: {ex.Message}");
|
||||||
Log("接收状态为false且未暂停,创建TCP连接");
|
}
|
||||||
|
|
||||||
// 清理之前的连接
|
try
|
||||||
try
|
{
|
||||||
|
// 只有在未暂停状态下才创建连接
|
||||||
|
if (!isPaused)
|
||||||
{
|
{
|
||||||
if (localStream != null)
|
Log("创建新的温度数据TCP连接...");
|
||||||
{
|
|
||||||
localStream.Close();
|
|
||||||
localStream = null;
|
|
||||||
}
|
|
||||||
if (localTcpClient != null)
|
|
||||||
{
|
|
||||||
localTcpClient.Close();
|
|
||||||
localTcpClient = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Log($"关闭旧连接异常: {ex.Message}");
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// 创建TCP客户端并连接
|
// 创建TCP客户端并连接
|
||||||
localTcpClient = new TcpClient
|
localTcpClient = new TcpClient
|
||||||
{
|
{
|
||||||
@@ -1219,7 +1209,7 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
localStream = localTcpClient.GetStream();
|
localStream = localTcpClient.GetStream();
|
||||||
localStream.ReadTimeout = RECEIVE_TIMEOUT;
|
localStream.ReadTimeout = RECEIVE_TIMEOUT;
|
||||||
|
|
||||||
// 只更新必要的状态标志
|
// 更新状态标志
|
||||||
lock (_lockObject)
|
lock (_lockObject)
|
||||||
{
|
{
|
||||||
_isReceivingTemperatureData = true;
|
_isReceivingTemperatureData = true;
|
||||||
@@ -1230,25 +1220,43 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
localStream.Write(startCommand, 0, startCommand.Length);
|
localStream.Write(startCommand, 0, startCommand.Length);
|
||||||
localStream.Flush();
|
localStream.Flush();
|
||||||
Log("已发送开始温度数据传输命令");
|
Log("已发送开始温度数据传输命令");
|
||||||
|
|
||||||
// 更新局部状态标志
|
|
||||||
isReceiving = true;
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
else
|
||||||
{
|
{
|
||||||
Log($"TCP连接或初始化失败: {ex.Message}");
|
// 暂停状态下短暂等待后重试
|
||||||
// 连接失败后等待1秒再重试
|
Log("处于暂停状态,等待后重试连接");
|
||||||
Thread.Sleep(LONG_SLEEP_MS);
|
Thread.Sleep(LONG_SLEEP_MS);
|
||||||
continue;
|
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
|
try
|
||||||
{
|
{
|
||||||
|
// 更新状态标志
|
||||||
|
lock (_lockObject)
|
||||||
|
{
|
||||||
|
_isReceivingTemperatureData = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查流是否有数据可读
|
||||||
if (localStream.DataAvailable)
|
if (localStream.DataAvailable)
|
||||||
{
|
{
|
||||||
// 读取数据
|
// 读取数据
|
||||||
@@ -1259,14 +1267,14 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
Array.Copy(buffer, receivedBytes, bytesRead);
|
Array.Copy(buffer, receivedBytes, bytesRead);
|
||||||
Log($"接收到温度数据字节数: {bytesRead}");
|
Log($"接收到温度数据字节数: {bytesRead}");
|
||||||
|
|
||||||
// 如果暂停,接收后丢弃
|
// 根据暂停状态决定是否处理数据
|
||||||
if (isPaused)
|
if (isPaused)
|
||||||
{
|
{
|
||||||
Log("接收状态为true但处于暂停状态,数据已接收但丢弃");
|
Log("处于暂停状态,数据已接收但丢弃");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 否则同步接收并处理数据
|
// 同步接收并处理数据
|
||||||
lock (temperatureDataAccumulator)
|
lock (temperatureDataAccumulator)
|
||||||
{
|
{
|
||||||
temperatureDataAccumulator.AddRange(receivedBytes);
|
temperatureDataAccumulator.AddRange(receivedBytes);
|
||||||
@@ -1278,10 +1286,13 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
{
|
{
|
||||||
// 连接已关闭
|
// 连接已关闭
|
||||||
Log("远程主机关闭了连接");
|
Log("远程主机关闭了连接");
|
||||||
|
|
||||||
|
// 重置状态标志,下一次循环会创建新连接
|
||||||
lock (_lockObject)
|
lock (_lockObject)
|
||||||
{
|
{
|
||||||
_isReceivingTemperatureData = false;
|
_isReceivingTemperatureData = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 清理连接资源
|
// 清理连接资源
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -1289,6 +1300,7 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
localTcpClient.Close();
|
localTcpClient.Close();
|
||||||
}
|
}
|
||||||
catch {}
|
catch {}
|
||||||
|
|
||||||
localStream = null;
|
localStream = null;
|
||||||
localTcpClient = null;
|
localTcpClient = null;
|
||||||
continue;
|
continue;
|
||||||
@@ -1303,11 +1315,13 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Log($"接收数据异常: {ex.Message}");
|
Log($"接收数据异常: {ex.Message}");
|
||||||
// 连接异常,重置状态准备重连
|
|
||||||
|
// 更新状态标志
|
||||||
lock (_lockObject)
|
lock (_lockObject)
|
||||||
{
|
{
|
||||||
_isReceivingTemperatureData = false;
|
_isReceivingTemperatureData = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 清理连接资源
|
// 清理连接资源
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -1315,9 +1329,11 @@ namespace JoyD.Windows.CS.Toprie
|
|||||||
localTcpClient.Close();
|
localTcpClient.Close();
|
||||||
}
|
}
|
||||||
catch {}
|
catch {}
|
||||||
|
|
||||||
localStream = null;
|
localStream = null;
|
||||||
localTcpClient = null;
|
localTcpClient = null;
|
||||||
// 短暂休眠后重试
|
|
||||||
|
// 异常后等待一段时间再重试
|
||||||
Thread.Sleep(ERROR_SLEEP_MS);
|
Thread.Sleep(ERROR_SLEEP_MS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user