我通过套接字接收一些数据并尝试将其添加到队列中,以便它可以被另一个更慢的线程(如缓冲区)出列。
问题在于,每当我将新值排入队列时,队列中的所有值都会变为该值。
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);
}
但是遇到了同样的问题。
任何想法如何解决这个问题?
答案 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);