You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Thread问题:Events_DataReceived中调用tcp2rtu_Response未正常执行

问题原因
  1. 索引越界异常导致方法执行中断
    tcp2rtu_Response方法中的循环条件错误使用了i <= tcpReceived.Length:C#数组下标从0开始,数组有效下标范围是0 ~ tcpReceived.Length - 1,当i等于tcpReceived.Length时访问tcpReceived[i]会直接抛出IndexOutOfRangeException,导致方法终止,ReceiveBuffer自然无法完成赋值。
  2. 异常抛出后中断后续代码执行
    Invoke委托内部抛出的异常会被传播到调用Invoke的线程,外层catch捕获到异常后弹出提示,直接跳过了mbRcvDataMngr()的执行逻辑。
  3. 潜在的数组初始化问题
    如果公共数组ReceiveBuffer未提前初始化,或者初始化的长度小于实际需要的长度(最小长度为tcpReceived.Length - 6),也会触发索引越界异常。
  4. 缺少参数校验
    如果接收到的tcpReceived数组长度小于8,访问下标6、7的位置时同样会触发索引越界。
解决建议
  • 修复循环条件
    将循环判断修改为:
for(int i = 8; i < tcpReceived.Length; i++) 
{
    ReceiveBuffer[i - 6] = tcpReceived[i];      
}
  • 增加参数与数组长度校验
    在tcp2rtu_Response方法开头增加校验逻辑,避免非法访问越界:
public void tcp2rtu_Response(byte[] tcpReceived) 
{
    // 输入参数合法性校验
    if (tcpReceived == null || tcpReceived.Length < 8)
    {
        return;
    }
    // 确保ReceiveBuffer长度足够
    int needLength = tcpReceived.Length - 6;
    if (ReceiveBuffer == null || ReceiveBuffer.Length < needLength)
    {
        ReceiveBuffer = new byte[needLength];
    }
    ReceiveBuffer[0] = tcpReceived[6];
    ReceiveBuffer[1] = tcpReceived[7];
    for(int i = 8; i < tcpReceived.Length; i++) 
    {
        ReceiveBuffer[i - 6] = tcpReceived[i];      
    }
}
  • 完善异常日志输出
    将外层异常捕获的输出改为完整异常信息,方便定位问题:
catch (Exception exception)
{
    MessageBox.Show(exception.ToString());
}
  • 增加线程安全控制
    ReceiveBuffer是公共可访问数组,多线程场景下操作时建议加锁,避免多线程同时修改导致数据错乱。

内容的提问来源于stack exchange,提问作者cinargursoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:54:03