在每个Enqueue()之后,队列中的所有值都变得相同

时间:2014-05-26 15:16:22

标签: c# pointers queue

我通过套接字接收一些数据并尝试将其添加到队列中,以便它可以被另一个更慢的线程(如缓冲区)出列。

问题在于,每当我将新值排入队列时,队列中的所有值都会变为该值。

                    byte[] aux = new byte[1464];
                    aux = (byte[])ar.AsyncState;

                    //add the package to the package fifo list
                    lock (lockPktBuffer)
                    {
                        packetBuffer.Enqueue(aux);
                    }                  

首先我认为我正在传递指针,因此所有条目都指向同一个变量。

所以我试着这样做:

                    lock (lockPktBuffer)
                    {
                        packetBuffer.Enqueue((byte[])ar.AsyncState);
                    }     

但是遇到了同样的问题。

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

这是正在发生的事情(见评论):

// This line creates a new array
byte[] aux = new byte[1464];
// This line "forgets" the new array, and replaces it with ar.AsyncState: 
aux = (byte[])ar.AsyncState;

结果是,队列的所有添加都会将从ar.AsyncState返回的同一对象排入队列,从而产生您看到的效果(队列中的所有实例看起来都相同)。

以下是解决问题的方法:

byte[] aux = ((byte[])(ar.AsyncState).ToArray();
...
packetBuffer.Enqueue(aux);

此调用将ar.AsyncState的副本复制到新的字节数组中,确保您排队的所有实例都是独立的

答案 1 :(得分:0)

您正在传递参考。将数组分配给另一个数组时,它是复制的引用,它不会复制数组中的数据。

要制作阵列的副本,您需要专门复制其中的数据。例如:

// get the reference to the source array
byte[] source = (byte[])ar.AsyncState;
// create a new array with the same size
byte[] aux = new byte[source.Length];
// copy all the values from the source
Array.Copy(source, aux, source.Length);