Eingeschränkter Task Scheduler auf Concurrency-Ebene (mit Task-Priorität), der umschlossene Tasks verarbeitet

Es fällt mir schwer, einen Aufgabenplaner zu finden, mit dem ich priorisierte Aufgaben planen, aber auch "umschlossene" Aufgaben erledigen kann. Es ist so etwas wie wasTask.Run versucht zu lösen, aber Sie können keinen Taskplaner angebenTask.Run. Ich habe eine verwendetQueuedTaskScheduler von demExtras Beispiele für parallele Erweiterungen zur Lösung der Aufgabenprioritätsanforderung (auch von dieser vorgeschlagen)Post).

Hier ist mein Beispiel:

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

Die typische Ausgabe des obigen Beispiels ist:

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

Was ich will ist:

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

BEARBEITEN:

Ich glaube, ich suche einen Taskplaner, ähnlich wieQueuedTaskScheduler, das wird dieses Problem lösen. Aber auch andere Vorschläge sind willkommen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage