//--- Constructors --- /// <summary> /// Create an instance of the work queue. /// </summary> /// <param name="handler">Dispatch action for work item Type and with completion callback.</param> /// <param name="maxParallelism">Maximum number of items being dispatch simultaneously against the dispatch queue.</param> /// <param name="dispatchQueue">Dispatch queue for work items.</param> public ProcessingQueue(Action <T, Action> handler, int maxParallelism, IDispatchQueue dispatchQueue) { if (dispatchQueue == null) { throw new ArgumentNullException("dispatchQueue"); } if (handler == null) { throw new ArgumentNullException("handler"); } if ((maxParallelism <= 0) || (maxParallelism > MAX_PARALLELISM)) { throw new ArgumentException(string.Format("maxParallelism must be between 1 and {0:#,##0}", MAX_PARALLELISM), "maxParallelism"); } _handler = handler; _dispatchQueue = dispatchQueue; // prime the pending queue with dispatchers for (var i = 0; i < maxParallelism; ++i) { if (!_pending.TryEnqueue(StartWorkItem)) { throw new NotSupportedException(); } } }
//--- Methods --- /// <summary> /// Try to queue a work item for dispatch. /// </summary> /// <param name="item">Item to add to queue.</param> /// <returns><see langword="True"/> if the enqueue succeeded.</returns> public bool TryEnqueue(T item) { if ((_inbox != null) && (Interlocked.Decrement(ref _capacity) < 0)) { return(_inbox.TryEnqueue(item)); } return(TryStartWorkItem(item)); }