2009-10-16 10 views
5

Ho diversi compiti a bassa impronta da eseguire quando è disponibile un po 'di tempo per la cpu. Non voglio che questa attività venga eseguita se sono in esecuzione altre attività di importazione. Ad esempio, se viene eseguito un task normale/ad alta priorità, desidero sospendere l'attività di importanza bassa finché non viene eseguita l'attività di importanza.C# priorità del filo inferiore nel pool di filetti

Esiste un numero piuttosto elevato di attività a bassa importanza da eseguire (da 50 a 1000). Quindi non voglio creare un thread per attività. Tuttavia, credo che il threadpool non permetta alcune specifiche di priorità, vero?

Come faresti a risolvere questo?

risposta

2

È possibile creare una nuova discussione e utilizzare Dispatcher per inviarlo su various priorities.

Le priorità sono un po 'incentrate sull'interfaccia utente, ma questo non importa.

2

Non si dovrebbe scherzare con la priorità del regolareThreadPool, poiché non sei l'unico consumatore. Suppongo che l'approccio logico sarebbe quello di scrivere il tuo - forse semplice come una coda produttore/consumatore, usando il tuo Thread (s) come consumatore/i - impostando tu stesso la priorità del thread.

.NET 4.0 include nuove librerie (la TPL ecc.) Per semplificare tutto questo - fino a quel momento è necessario un codice aggiuntivo per creare un pool di thread personalizzato o una coda di lavoro.

+0

Il trucco è che non voglio iniziare i compiti date le loro priorità, voglio che vengano eseguiti in base alla loro condizione. (vale a dire un'attività a bassa priorità dovrebbe interrompersi se si esegue una priorità alta) – Toto

+0

NB: Sto usando il framework 3.5 – Toto

+0

Quindi dovresti cercare "priority queue C#" - ce ne sono molti, ma io posso t raccomandare direttamente qualsiasi particolare. Sospetto * che il TPL lo offra direttamente quando viene rilasciato. –

2

Quando si utilizza la build in ThreadPool, tutti i thread vengono eseguiti con la priorità predefinita. Se si scherza con questa impostazione, verrà ignorata. Questo è un caso in cui devi lanciare il tuo ThreadPool. Alcuni anni fa ho esteso lo SmartThreadPool per soddisfare le mie esigenze. Questo potrebbe soddisfare anche il tuo.

0

Vorrei creare una coda condivisa di oggetti task in sospeso, con ogni oggetto che specifica la sua priorità. Quindi scrivi un thread di dispatcher che controlla la coda e avvia un nuovo thread per ogni attività, fino a un limite massimo di thread e specifica la priorità del thread mentre lo crea. È solo una piccola quantità di lavoro per farlo, e si può avere l'attività di report del dispatcher e anche regolare dinamicamente il numero di thread in esecuzione. Quel concetto ha funzionato molto bene per me e può essere incluso in un servizio di Windows per l'avvio se si fa la coda a una tabella di database.