Search code examples
c#.netconcurrencyproducer-consumerconcurrent-queue

What is the difference between TryDequeue and TryTake in a ConcurrentQueue<>?


In the ConcurrentQeueue<> class, and extra method TryDequeue() is defined. But, as it implements IProducerConsumerCollection<>, it also has a TryTake() method. According to the docs, they both do the same thing:

TryDequeue:

Tries to remove and return the object at the beginning of the concurrent queue.

TryTake:

For ConcurrentQueue, this operation will attempt to remove the object from the beginning of the ConcurrentQueue.

Why bother with implementing that TryDequeue method?


Solution

  • What is the difference between TryDequeue and TryTake in a ConcurrentQueue<>

    According to available source code there is no difference as TryTake invokes TryDequeue

    /// <summary>
    /// Attempts to remove and return an object from the <see cref="Concurrent.IProducerConsumerCollection{T}"/>.
    /// </summary>
    /// <param name="item">
    /// When this method returns, if the operation was successful, <paramref name="item"/> contains the
    /// object removed. If no object was available to be removed, the value is unspecified.
    /// </param>
    /// <returns>true if an element was removed and returned successfully; otherwise, false.</returns>
    /// <remarks>For <see cref="ConcurrentQueue{T}"/>, this operation will attempt to remove the object
    /// from the beginning of the <see cref="ConcurrentQueue{T}"/>.
    /// </remarks>
    bool IProducerConsumerCollection<T>.TryTake([MaybeNullWhen(false)] out T item) => TryDequeue(out item);
    

    Souce: https://source.dot.net/#System.Private.CoreLib/ConcurrentQueue.cs,201

    Why bother with implementing that TryDequeue method?

    TryDequeue follows expected name conventions associated with queues and is local to ConcurrentQueue<>. As well, TryTake follows naming convention normally associated with producer/consumer pattern.