/// <summary>
 /// Removes task from queue
 /// </summary>
 public void RemoveTaskFromQueue(Task task)
 {
     lock (_taskQueue)
     {
         if (_taskQueue.Remove(task))
         {
             TaskRemovedFromQueue?.Invoke(this, new TaskEventArgs(task));
         }
     }
 }
        /// <summary>
        /// Enqueues a task for execution
        /// </summary>
        public void EnqueueTask(Task task)
        {
            // Enqueue
            lock (_taskQueue)
            {
                _taskQueue.Add(task);
                TaskAddedToQueue?.Invoke(this, new TaskEventArgs(task));
            }

            // If not busy - pop queue straight away
            TryPopQueue();
        }
        /// <summary>
        /// Aborts the execution of the given task if it's running or removes it from the queue if it's enqueued
        /// </summary>
        public void AbortTask(Task task)
        {
            lock (_taskQueue)
            {
                // Current task
                if (Task == task)
                {
                    AbortCurrentTask();
                }

                // Tasks in queue
                RemoveTaskFromQueue(task);
            }
        }