Копируются ли объекты в 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);
}
Когда я запускаю это, яисключение Out of Memory через некоторое время.Я подумал, что это может быть из-за того, что сборщик мусора не собирает 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.
Теперь я подумал, что проблема была решена, потому что, когда я ставил объекты в очередь, только ссылка на объектыпривязан к очереди, но я боялся, что все элементы в очереди ссылаются на один и тот же объект, поэтому я проверил другую функцию, имеющуюся в другом потоке:
// while bufferQueue is not empty do the following
BufferElement bufferElement = null;
bufferQueue.TryDequeue(out bufferElement);
ИЯ проверил содержание пары элементов и увидел, что их содержание было другим!поэтому, если объекты, помещенные в очередь, копируются по значению, почему я сначала получил исключение «Недостаточно памяти»?