/// <summary>
 /// Use only with TryDequeue without overridden priority!
 /// Awaitable returns completed as long as there are any items for any priority!
 /// </summary>
 public AsyncEnqueuedCompletionUC EnqueuedItemsAsync()
 {
     using (Lock.Enter())
     {
         if (HasItems())
         {
             return(AsyncEnqueuedCompletionUC.Completed);
         }
         TaskCompletionSource <object> asyncEnqueued = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously);
         NotifyAnyPriority.Enqueue(asyncEnqueued);
         return(new AsyncEnqueuedCompletionUC(asyncEnqueued.Task));
     }
 }
        /// <summary>
        /// If <see cref="prioritySelector"/> is not supported value => Exception
        /// </summary>
        public override void Enqueue(TPrioritySelectorEnum prioritySelector, TItem item)
        {
            base.Enqueue(prioritySelector, item);

            using (Lock.Enter())
            {
                int iMax = NotifyAnyPriority.Count;
                for (int i = 0; i < iMax; i++)
                {
                    NotifyAnyPriority.Dequeue().TrySetResult(null);
                }

                Queue <TaskCompletionSource <object> > priorityQueue = NotifyPriority[prioritySelector];
                iMax = priorityQueue.Count;
                for (int i = 0; i < iMax; i++)
                {
                    priorityQueue.Dequeue().TrySetResult(null);
                }
            }
        }