字节分配不一致

Geo*_*Ego 1 .net c# arrays multithreading

尝试将一个字节数组的一部分分配给两个单独的字节数组时,我有一些奇怪的行为,作为串行命令在不同的串行端口上发送出去.我已经打破了代码,以便能够更轻松地完成它; 问题很容易重复,但对我来说毫无意义.

byte[] cmd1 = CLEAR_COMMAND;
byte[] cmd2 = CLEAR_COMMAND;

byte[] parameterBytesCmd1 = IntToByteArray(parameter1);
cmd1[3] = parameterBytesCmd1 [0];
cmd1[4] = parameterBytesCmd1 [1];

Thread.Sleep (100);

byte[] parameterBytesCmd2 = IntToByteArray(parameter2);
cmd2[3] = parameterBytesCmd2 [0];
cmd2[4] = parameterBytesCmd2 [1];
Run Code Online (Sandbox Code Playgroud)

您可以看到我正在使用几个整数参数,将它们转换为字节数组,然后将它们放入我构建的命令模板中的特定位置.如果我这样做,而不在中间睡至少100ms,内容cmd1cmd2将是相同的每一次- [3][4]两个cmd1cmd2将包含数据parameterBytesCmd1[0][1].

FWIW,这发生在一个单独的线程上.

Sco*_*ain 5

你的问题可能来自

byte[] cmd1 = CLEAR_COMMAND;
byte[] cmd2 = CLEAR_COMMAND;
Run Code Online (Sandbox Code Playgroud)

您正在复制命名阵列CLEAR_COMMANDcmd1cmd2和修改其内容.您需要复制数组并将其分配给变量,因此cmd1和cmd2不会修改原始记录,也不会相互交互.

如果using System.Linq;在文件顶部添加a ,则应该能够执行以下操作来生成数组的浅表副本.根据您是否希望cmd1和cmd2指向内存中的同一阵列,您可以执行任一操作

byte[] cmd1 = CLEAR_COMMAND.ToArray();
byte[] cmd2 = CLEAR_COMMAND.ToArray();
Run Code Online (Sandbox Code Playgroud)

要么

byte[] cmd1 = CLEAR_COMMAND.ToArray();
byte[] cmd2 = cmd1;
Run Code Online (Sandbox Code Playgroud)