C# Thread问题:Events_DataReceived中调用tcp2rtu_Response未正常执行
问题原因
- 索引越界异常导致方法执行中断
tcp2rtu_Response方法中的循环条件错误使用了i <= tcpReceived.Length:C#数组下标从0开始,数组有效下标范围是0 ~ tcpReceived.Length - 1,当i等于tcpReceived.Length时访问tcpReceived[i]会直接抛出IndexOutOfRangeException,导致方法终止,ReceiveBuffer自然无法完成赋值。 - 异常抛出后中断后续代码执行
Invoke委托内部抛出的异常会被传播到调用Invoke的线程,外层catch捕获到异常后弹出提示,直接跳过了mbRcvDataMngr()的执行逻辑。 - 潜在的数组初始化问题
如果公共数组ReceiveBuffer未提前初始化,或者初始化的长度小于实际需要的长度(最小长度为tcpReceived.Length - 6),也会触发索引越界异常。 - 缺少参数校验
如果接收到的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
相关产品推荐
相关产品推荐

