Programador de tareas de nivel de concurrencia limitada (con prioridad de tareas) que maneja tareas envueltas

Me cuesta mucho encontrar un programador de tareas en el que pueda programar tareas priorizadas, pero también puedo manejar tareas "ajustadas". Es algo como queTask.Run intenta resolver, pero no puede especificar un programador de tareas paraTask.Run. He estado usando unQueuedTaskScheduler desde elExtensiones paralelas Extras Muestras Para resolver el requisito de prioridad de la tarea (también sugerido por esteenviar).

Aquí está mi ejemplo:

class Program
{
    private static QueuedTaskScheduler queueScheduler = new QueuedTaskScheduler(targetScheduler: TaskScheduler.Default, maxConcurrencyLevel: 1);
    private static TaskScheduler ts_priority1;
    private static TaskScheduler ts_priority2;
    static void Main(string[] args)
    {
        ts_priority1 = queueScheduler.ActivateNewQueue(1);
        ts_priority2 = queueScheduler.ActivateNewQueue(2);

        QueueValue(1, ts_priority2);
        QueueValue(2, ts_priority2);
        QueueValue(3, ts_priority2);
        QueueValue(4, ts_priority1);
        QueueValue(5, ts_priority1);
        QueueValue(6, ts_priority1);

        Console.ReadLine();           
    }

    private static Task QueueTask(Func<Task> f, TaskScheduler ts)
    {
        return Task.Factory.StartNew(f, CancellationToken.None, TaskCreationOptions.HideScheduler | TaskCreationOptions.DenyChildAttach, ts);
    }

    private static Task QueueValue(int i, TaskScheduler ts)
    {
        return QueueTask(async () =>
        {
            Console.WriteLine("Start {0}", i);
            await Task.Delay(1000);
            Console.WriteLine("End {0}", i);
        }, ts);
    }
}

La salida típica del ejemplo anterior es:

Start 4
Start 5
Start 6
Start 1
Start 2
Start 3
End 4
End 3
End 5
End 2
End 1
End 6

Lo que quiero es:

Start 4
End 4
Start 5
End 5
Start 6
End 6
Start 1
End 1
Start 2
End 2
Start 3
End 3

EDITAR:

Creo que estoy buscando un programador de tareas, similar aQueuedTaskScheduler, eso solucionará este problema. Pero cualquier otra sugerencia es bienvenida.

Respuestas a la pregunta(3)

Su respuesta a la pregunta