ConcurrentQueue <byte []>中的所有项都相同

zot*_*tty 2 c# concurrent-queue

我有一个NetworkStream用于从另一个程序获取数据.数据以Byte [64]的形式到达,然后我将其排入ConcurrentQueue,以便其他线程可以在以后出列以进行分析.队列被实例化:

ConcurrentQueue<byte[]> fifo = new ConcurrentQueue<byte[]>();
Run Code Online (Sandbox Code Playgroud)

然后我排队发送的所有数据:

Byte[] bytesIn = new Byte[64];
int i;
while ((i = stream.Read(bytesIn, 0, bytesIn.Length)) != 0)
{
    fifo.Enqueue(bytesIn);
}
Run Code Online (Sandbox Code Playgroud)

如果我然后查看(在调试期间),其中的数据fifo结果表明包含的每个字节[64]与最新的相同bytesIn.我如何确保我添加的数组fifo是值而不是指针(如果这是正确的术语)?

dca*_*tro 7

将数组的副本排入队列.您可以使用此ToArray扩展名.

while ((i = stream.Read(bytesIn, 0, bytesIn.Length)) != 0)
{
    var received = bytesIn.Take(i).ToArray();
    fifo.Enqueue(received);
}
Run Code Online (Sandbox Code Playgroud)

我还习惯Take修剪缓冲区,只复制收到的字节.

或者,正如@hvd在评论中所建议的那样,使用Array.Copy会更快

while ((i = stream.Read(bytesIn, 0, bytesIn.Length)) != 0)
{
    var received = new byte[i];
    Array.Copy(bytesIn, 0, received, 0, i);

    fifo.Enqueue(received);
}
Run Code Online (Sandbox Code Playgroud)

  • 总的来说,我会说不要过早优化,但在这种情况下,我认为很明显,"Take(i).ToArray()"做的工作比需要多得多,它可能会产生重大的可衡量的影响并且很容易以避免该问题的方式清楚地写出它:`var received = new byte [i];`然后调用`Array.Copy`. (5认同)