Являются ли объекты, помещенные в ConcurrentQueue, копируются в очередь или только их ссылки?ConcurrentQueue содержит ссылку на объект или значение? исключение «из памяти»
Я не понимаю ни одного сценария.
Объяснение:
Я определил ConcurrentQueue так:
// BufferElement is a class I created
private ConcurrentQueue<BufferElement> _bufferQueue;
У меня есть функция, которая называется много раз, и это purpsoe является епдиеим элементом в очередь:
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);
}
И я не получаю исключение, и WASN 't собирается получить один судить по памяти в диспетчере задач Windows.
Теперь я думал, что проблема была решена, потому что, когда я помещал объекты в очередь, только ссылка на объекты привязана к очереди, но я боялся, что все элементы в очереди ссылаются на один и тот же объект, поэтому я проверил другую функцию у меня в другом потоке, который делает то, что он является:
// while bufferQueue is not empty do the following
BufferElement bufferElement = null;
bufferQueue.TryDequeue(out bufferElement);
и я проверил содержание пары элементов и увидел, что их содержание было по-другому! поэтому, если объекты, помещенные в очередь, копируются по значению, почему я сначала получил исключение из памяти?
Ответ во многом зависит от того, что такое BufferElement, класс или структура. –
'BufferElement' - это класс – remi