字节分配不一致

时间:2016-10-17 14:36:52

标签: c# .net 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];

你可以看到我正在使用几个整数参数,将它们转换为字节数组,然后将它们放入我构建的命令模板中的特定位置。如果我这样做而没有在中间休息至少100毫秒,cmd1cmd2的内容每次都是相同的 - [3][4]两个cmd1 1}}和cmd2将包含来自parameterBytesCmd1[0][1]的数据。

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

1 个答案:

答案 0 :(得分:5)

您的问题可能来自

    private void Label_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        var lbl = (Label)sender;
        DragDrop.DoDragDrop(lbl, lbl.Content, DragDropEffects.Move);
        Console.WriteLine("Drag...");
    }

    private void Label_Drop(object sender, DragEventArgs e)
    {
        Console.WriteLine("Drop...");
    }

    private void Label_DragEnter(object sender, DragEventArgs e)
    {
        Console.WriteLine("Label_DragEnter...");
    }

    private void Label_DragLeave(object sender, DragEventArgs e)
    {
        Console.WriteLine("Label_DragLeave...");
    }

您正在将名为byte[] cmd1 = CLEAR_COMMAND; byte[] cmd2 = CLEAR_COMMAND; 的数组复制到CLEAR_COMMANDcmd1并修改其内容。您需要复制数组并将其分配给变量,因此cmd1和cmd2不会修改原始记录,也不会相互交互。

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

using System.Linq;

byte[] cmd1 = CLEAR_COMMAND.ToArray();
byte[] cmd2 = CLEAR_COMMAND.ToArray();