/// <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); } } }