public void ClearQueue()
        {
            lock (this)
            {
                // List of tasks that should be re-add after the queue is cleared.
                // This are tasks that are not allowed to be cancelled.
                List <FFmpegTask> addAgainAfterClear = new List <FFmpegTask>();

                // Clear all task references and empty queue.
                while (_queue.Count > 0)
                {
                    FFmpegTask task = _queue.Dequeue();

                    if (task.ForceCompletion)
                    {
                        addAgainAfterClear.Add(task);
                    }
                }
                _queue.Clear();

                // Add the "forced to complete" items again to the queue.
                foreach (FFmpegTask task in addAgainAfterClear)
                {
                    _queue.Enqueue(task);
                }
            }
        }
        public void AddToConvertQueue(IResultNode resultNode, IFFmpegCallback callbackObj, bool forceCompletion)
        {
            if (_queue == null)
            {
                return;
            }

            // add element to be converted to queue
            // call is thread safe
            FFmpegTask task = new FFmpegTask {
                QueueId = _queueId, DataPacket = resultNode, Callback = callbackObj, ForceCompletion = forceCompletion
            };

            lock (this)
            {
                _queue.Enqueue(task);

                // report to thread is has 1 (or more) elements in queue
                Monitor.Pulse(this);
            }
        }