Exemple #1
0
        //--- 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();
                }
            }
        }
Exemple #2
0
        //--- 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));
        }