排队到 ConcurrentQueue 的对象是被复制到队列还是仅复制到它们的引用?
我不明白任何场景。
解释:
我这样定义了一个 ConcurrentQueue:
// BufferElement is a class I created
private ConcurrentQueue<BufferElement> _bufferQueue;
我有一个被调用很多次的函数,其目的是将一个元素加入队列:
private void EnqueueElementToBuffer(string data, int moreData)
{
// the bufferElement constructor is setting data and moreData to it's fields.
BufferElement bufferElement = new BufferElement(data, moreData);
bufferQueue.Enqueue(bufferElement);
}
当我运行这个时,一段时间后我会出现内存不足异常。我想这可能是因为垃圾收集器没有收集bufferElement
因为它仍然在bufferQueue
,所以我将函数更改为:
private void EnqueueElementToBuffer(string data, int moreData)
{
// _bufferElement is now a filed of the class
_bufferElement.Data = data;
_bufferElement.MoreData = moreData;
bufferQueue.Enqueue(_bufferElement);
}
我没有得到异常,而且根据 Windows 任务管理器中的内存判断,我也不打算得到异常。
现在我认为问题已经解决了,因为当我将对象排队到队列中时,只有对对象的引用被cpoied到队列中,但我担心队列中的所有元素都引用同一个对象,所以我检查了另一个我在另一个线程中有一个函数,它的作用是:
// while bufferQueue is not empty do the following
BufferElement bufferElement = null;
bufferQueue.TryDequeue(out bufferElement);
我检查了几个元素的内容,发现它们的内容不同!那么,如果排队到队列中的对象是按值复制的,为什么我一开始会遇到内存不足异常?