/// <summary>Adds a new item to process to the end of the queue.</summary>
        /// <param name="action">The action to process.</param>
        /// <returns>A handle to the item within the queue.</returns>
        public ProcessQueueHandle Add(Action action)
        {
            // Setup initial conditions.
            if (action == null) throw new ArgumentNullException("action");

            // Create the handle and store ite.
            var handle = new ProcessQueueHandle(this, action, OnProcessing, OnProcessed);
            lock (queue)
            {
                queue.Enqueue(handle);
            }

            // Finish up.
            return handle;
        }
 /// <summary>Removes the given handle from the queue.</summary>
 /// <param name="handle">The handle to remove.</param>
 public void Remove(ProcessQueueHandle handle)
 {
     if (handle == null) return;
     lock (queue)
     {
         var list = queue.ToList();
         list.Remove(handle);
         queue.Clear();
         foreach (var item in list)
         {
             queue.Enqueue(item);
         }
     }
 }
 /// <summary>Determines whether the specified handle is contained within the queue.</summary>
 /// <param name="handle">The handle to look for.</param>
 public bool Contains(ProcessQueueHandle handle)
 {
     return queue.Contains(handle);
 }
 /// <summary>Gets the position of a handle within the queue.</summary>
 /// <param name="handle">The handle to examine.</param>
 /// <returns>The position within the queue, descending (0 is next to be processed, -1 means already processed or not part of this queue).</returns>
 public int GetPosition(ProcessQueueHandle handle)
 {
     if (handle == null) return -1;
     return queue.ToList().IndexOf(handle);
 }
 public ProcessQueueEventArgs(ProcessQueueHandle handle)
 {
     Handle = handle;
 }