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