public bool TryDequeue (out T result)
{
result = default (T);
+ Node oldNext = null;
bool advanced = false;
while (!advanced) {
Node oldHead = head;
Node oldTail = tail;
- Node oldNext = oldHead.Next;
+ oldNext = oldHead.Next;
if (oldHead == head) {
// Empty case ?
}
}
+ oldNext.Value = default (T);
+
Interlocked.Decrement (ref count);
return true;
{
queue.CopyTo (new int[3], 0);
}
+
+ static WeakReference CreateWeakReference (object obj)
+ {
+ return new WeakReference (obj);
+ }
+
+ [Test]
+ public void TryDequeueReferenceTest ()
+ {
+ var obj = new Object ();
+ var weakReference = CreateWeakReference(obj);
+ var queue = new ConcurrentQueue<object> ();
+
+ queue.Enqueue (obj);
+ queue.TryDequeue (out obj);
+ obj = null;
+
+ GC.Collect ();
+ GC.WaitForPendingFinalizers ();
+
+ Assert.IsFalse (weakReference.IsAlive);
+ }
}
}
#endif