2010-02-09 16 views
7

Ho scritto un'applicazione Winforms .NET che utilizza un thread secondario per eseguire un processo pesante, che comunica il suo avanzamento al thread dell'interfaccia utente. Tutto funziona correttamente, il modulo mostra il progresso e ho anche creato un pulsante Annulla per interrompere il thread di elaborazione. Tuttavia, quando il processo richiede molto tempo, l'applicazione e l'intero computer rallentano. Ci vuole molto tempo a trascinare le finestre, e c'è anche un significativo ritardo nel tentativo di digitare lettere nel blocco note.Modifica priorità del thread per rendere più reattivo il mio programma e il computer

Suppongo di dover ridurre la priorità del thread di elaborazione e/o aumentare la priorità del thread dell'interfaccia utente. È giusto? In questo momento entrambi i thread sono normali priorità.

È semplice come il follwing? O c'è qualcos'altro che dovrei fare?

Thread.CurrentThread.Priority = ThreadPriority.AboveNormal; 

Come devo modificare le priorità? Dovrei ridurre la priorità dell'elaborazione o aumentare la priorità dell'interfaccia utente o entrambi? E a quale impostazione? AboveNormal, o più alto?

+0

Eric, che tipo di processore è nella tua macchina di sviluppo? Con quale frequenza il thread di lavoro comunica nuovamente all'interfaccia utente? – overslacked

risposta

0

Generalmente si desidera lasciare la priorità del thread principale da solo e ridurre la priorità del thread di elaborazione a Idle.

+0

Impostandolo in modalità inattiva, una routine di elaborazione intensiva di lunga durata richiederà molto più tempo, potenzialmente. Meglio impostarlo su BelowNormal. –

+0

@Reed: in genere non c'è alcuna differenza tra i due. L'unico modo in cui c'è qualche differenza è se c'è un altro thread in Idle o BelowNormal priority - nessuno dei quali è particolarmente comune. –

+0

Ci sono alcuni servizi impostati su BelowNormal. In realtà ho trovato una differenza notevole nel mio codice ... –

1

Se si desidera che il thread in background non influenzi la reattività del sistema nel suo complesso, è necessario abbassarlo, molto probabilmente impostando la sua priorità su BelowNormal.

Altrimenti, avrà lo stesso effetto che stai vedendo attualmente.

Ciò detto, sarei restio a farlo nel mio codice. Se il tuo programma viene eseguito su un sistema con più core di elaborazione, questo probabilmente non sarà un problema e l'abbassamento della priorità del thread (potenzialmente) causerà l'elaborazione del processo da parte dell'algoritmo.

5

Non necessariamente penso che la priorità del thread sia il problema (anche se potrebbe farne parte). Dai un'occhiata a questa domanda SO: Background Worker Thread Priority.

Probabilmente i loop troppo stretti nella thread in background mantengono il tempo di CPU su quel thread. Esistono diversi modi per risolverlo dal brutale (thread sleep) al più ragionevole (mutex ed eventi).

È anche possibile provare a profilare il thread in background (direttamente o in un'imbracatura di test) per vedere dove trascorre la maggior parte del tempo e provare a isolarlo con eventi asincroni o tecniche offload simili.

+0

+1: questa è la soluzione migliore – Tim

+0

Se il lavoro è veramente "pesante elaborazione", come specificato, quindi provare a utilizzare mutex ed eventi, ecc, rallenterà drasticamente l'elaborazione. Utilizzare la CPU al massimo non è una cosa negativa: utilizzarlo inutilmente è il problema ... –

+0

Dipende dalla definizione di "elaborazione pesante". Sono d'accordo con te, anche se Reed, se sei già fortemente investito, allora aggiungere ulteriori switch di contesto non farà altro che peggiorare le cose. È stata comunque la mia esperienza, che a volte una segmentazione del lavoro applicata con attenzione (usando mutex e segnali) può alleviare la contesa sul processore, senza influenzare significativamente la velocità, anche se ci sarà sempre qualche perdita. – GrayWizardx

0

Normalmente si dovrebbe impostare la priorità del thread di lavoro ad un buon livello (ad esempio, l'utente potrebbe voler fare qualcosa in un'altra applicazione e anche il thread di lavoro dovrebbe giocare) anche se Windows potenzia già i processi "attivi" thread (l'applicazione si ha una finestra con focus di input) un po 'così si sentirà più reattivo. Le priorità più alte sono solitamente necessarie quando è necessario rispettare alcuni limiti di tempo.

+0

Anche una nota (non il problema principale): si dovrebbe essere consapevoli del fatto che avere thread con priorità diverse può produrre strani problemi di concorrenza (cose come: cosa succede se un thread con un basso prio afferra una sezione critica e non è mai programmato di nuovo perché un normale o superiore prio thread prende l'intera CPU) –

+0

@Ritsaert: l'utilità di pianificazione di Windows ha una "prevenzione della fame", quindi anche se qualcosa è impostato su priorità bassa, la sua priorità verrà occasionalmente "bump" in modo che possa essere eseguita e (eventualmente) rilasciata la sezione critica/mutex/qualunque cosa stia tenendo. –

+0

@Jerry: Grazie per l'aggiunta. So che le versioni di Windows più recenti hanno questo, ma anche con quello in atto può contenere i blocchi per un lungo periodo (relativamente parlando) –

Problemi correlati