2012-02-16 19 views
17

Attualmente sto usando il LimitedConcurrencyLevelTaskScheduler dettagliato qui http://msdn.microsoft.com/en-us/library/ee789351.aspx.Net TPL: programmatore di attività a livello di concorrenza limitato con priorità delle attività?

Voglio migliorare questo in modo che gli individui possono essere assegnati compiti di priorità. Queste priorità non devono necessariamente mappare alla priorità del thread. Dovrebbe solo influenzare l'ordine in cui vengono avviate le attività.

Qualcuno sa di un esempio di un tale programma di pianificazione? (molte cose di pianificazione sono passate per la testa quindi sarebbe bello se esistesse una soluzione esistente)

+0

Che scheduler utilizza un LinkedList per una coda. Provare a cambiarlo in SortedList dove T è una struttura che contiene un'attività e un numero intero per priorità e ordinare l'elenco su T.Priority. –

+1

@IgbyLargeman - [SortedList] (http://msdn.microsoft.com/en-us/library/ms132319.aspx) potrebbe non essere una soluzione ideale: le chiavi (priorità) devono essere uniche. La maggior parte dei sistemi prioritari ha solo pochi livelli e consente di assegnare più oggetti alla stessa priorità –

+0

è una cattiva idea. Una coda con internamente un set (array) di code - una per ogni priorità - è un modo migliore. Le priorità non sono uniche e limitate a un numero limitato di esse. Inoltre, non utilizzare un elenco collegato: ho una "coda" che utilizza internamente matrici di 4096 elementi, oltre a opointer. molto meno allocazione - gli elementi vengono rimossi dalla "pagina" frontale, aggiunta al nd. Meno allocazioni, meno rifiuti da raccogliere. – TomTom

risposta

37

Il Parallel Extensions Extras Samples. fornisce già tale scheduler, QueuedTaskScheduler. Questo programma di pianificazione fornisce priorità, limiti di concorrenza, equità e controllo a grana fine sul tipo e le priorità dei thread utilizzati. Naturalmente, non è necessario utilizzare o configurare le funzionalità che non sono necessarie.

Stephen Toub fornisce una breve descrizione dei vari scheduler nei Parallel Extensions Extra here

Per utilizzare il QueuedTaskScheduler, si chiama il suo metodo ActivateNewQueue con la priorità è necessario. Questo metodo restituisce un nuovo oggetto Queue derivato da TaskScheduler gestito dal controllore TaskScheduler. Tutte le attività che utilizzano una coda specifica sono pianificate dal TaskScheduler padre in base alle loro priorità.

Il codice seguente crea un programmatore con un livello massimo concorrenza di 4, due code di priorità e gli orari di un compito sulla prima coda:

QueuedTaskScheduler qts = new QueuedTaskScheduler(TaskScheduler.Default,4); 
TaskScheduler pri0 = qts.ActivateNewQueue(priority: 0); 
TaskScheduler pri1 = qts.ActivateNewQueue(priority: 1); 

Task.Factory.StartNew(()=>{ }, 
         CancellationToken.None, 
         TaskCreationOptions.None, 
         pri0); 
+0

+1: gli extra di estensione paralleli sono inestimabili! – dotnetguy

1

Utilizzare una struttura di dati ordinata o prioritaria per l'elenco delle attività. Quindi crea il tuo add che prende in Priority. Questo potrebbe non essere buono come altri, ma darà priorità all'Elenco delle attività. Puoi riutilizzare il 99% del codice lì. Basta sostituire LinkedList con una lista ordinata o usare LINQ per ordinare e scrivere un metodo che ha la priorità.

Problemi correlati