是否將已排入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將不會通過Windows任務管理器中的內存進行判斷。
現在我認爲problam已經解決了,因爲當我將對象排入隊列時,只有對對象的引用被複制到隊列中,但是我擔心隊列中的所有元素都引用同一個對象,所以我檢查其他功能我在另一個線程其中它的作用是:
// while bufferQueue is not empty do the following
BufferElement bufferElement = null;
bufferQueue.TryDequeue(out bufferElement);
而且我查了幾個元素的含量,發現他們的內容是不同的!所以如果隊列中的對象被值複製,爲什麼最初我得到了內存不足異常?
答案在很大程度上取決於什麼'BufferElement'是一個類或一個結構。 – 2012-04-02 18:28:27
'BufferElement'是一個類 – remi 2012-04-02 18:36:18