2010-11-01 12 views
5

Ich benutze Task-Bibliothek für meine Bildkomprimierungsdienst. Ich würde viele Dateien gleichzeitig komprimieren. Aber ich möchte, dass der Dienst nur ausgeführt wird, wenn sich der Benutzer im Leerlauf befindet (oder keine Aufgabe mehr im Programm ausführt).wie hinzufügen Aufgaben Priorität Funktionalität

Ich weiß, dass threadPool nicht unterstützt "Thread Priorität ändern" -Funktion, so dass Task auch diese Funktion unterstützt.

Kann ich entwickeln, dass die Funktionalität auf höherer Ebene der Kontrolle? (Taskscheduler Priorität zum Beispiel)

+0

implementieren eine Prioritätswarteschlange – zengr

+0

zengr Könnten Sie Sie einen Kommentar klären? – Ivan

Antwort

4

Wie @zengr erwähnte, können Sie eine Prioritätswarteschlange Muster verwenden, um dieses Problem zu lösen. Es gibt tatsächlich a good sample in MSDN zum Implementieren von Prioritätswarteschlangen, die ConcurrentQueue<T> Instanzen pro Priorität verwenden, und dann das Wrapping mit einer benutzerdefinierten IProducerConsumerCollection<T>-Implementierung, die Elemente aus der Warteschlange mit höherer Priorität vor den niedrigeren einzieht. Mit dieser Art der Implementierung kann Ihr Hersteller bestimmen, wie viele Prioritäten er haben soll, die Priorität beim Hinzufügen des Elements zuweisen und Ihren Kunden zuerst an den Elementen mit der höchsten Priorität arbeiten lassen, ohne jemals den Prioritätsalgorithmus verstehen zu müssen.

2

Sie können eine benutzerdefinierte TaskScheduler für die Task Parallel-Bibliothek erstellen und dann Tasks darauf planen, indem Sie eine Instanz davon an den TaskFactory-Konstruktor übergeben.

Hier ist ein Beispiel dafür, wie das zu tun: Task Scheduler with priority