/// <summary>
        /// Schedules a task.
        /// </summary>
        /// <param name="tag"></param>
        /// <param name="action"></param>
        /// <returns></returns>
        public static ITaskQueue <TTaskInfo> Schedule <TTaskInfo>(this ITaskQueue <TTaskInfo> source, string tag, Action <TaskInfo, CancellationToken> action)
            where TTaskInfo : TaskInfo
        {
            var taskInfo = new TaskInfo(source, async(q, ct) => action(q, ct), tag);

            return((ITaskQueue <TTaskInfo>)source.Schedule(taskInfo));
        }
        /// <summary>
        /// Schedules a task.
        /// </summary>
        /// <param name="tag"></param>
        /// <param name="task"></param>
        /// <returns></returns>
        public static ITaskQueue <TTaskInfo> Schedule <TTaskInfo>(this ITaskQueue <TTaskInfo> source, string tag, Task task)
            where TTaskInfo : TaskInfo
        {
            var taskInfo = new TaskInfo(source, async(q, ct) => await task);

            return((ITaskQueue <TTaskInfo>)source.Schedule(taskInfo));
        }
        /// <summary>
        /// Schedules a task.
        /// </summary>
        /// <param name="tag"></param>
        /// <param name="action"></param>
        /// <returns></returns>
        public static ITaskQueue <TTaskInfo> Schedule <TTaskInfo>(this ITaskQueue <TTaskInfo> source, string tag, Func <TaskInfo, CancellationToken, Task> action)
            where TTaskInfo : TaskInfo
        {
            var taskInfo = new TaskInfo(source, action, tag);

            return((ITaskQueue <TTaskInfo>)source.Schedule(taskInfo));
        }