2011-12-04 22 views
9

Non ho in mente uno scenario specifico, ma questa domanda mi è passata per la mente mentre pensavo a scenari in cui potrei voler usare un Timer su un DispatcherTimer.Prestazioni per Timer vs DispatcherTimer

Nello scenario in cui devo eseguire venire computazionalmente compito molto ogni volta che un timer generato l'evento, e quindi rendono minori modifiche UI, sarebbe meglio in termini di prestazioni:

  1. uso un regolare Timer e quindi utilizzare Dispatcher dell'applicazione su cambiare l'interfaccia utente
  2. utilizzare un DispatcherTimer (e possibilmente eseguire il mio lavoro di computazione su in alcuni operatori asincroni in background, se necessario).

La mia ipotesi è che mantenere il thread dell'interfaccia utente sbloccato il più a lungo possibile migliorerà l'esperienza dell'utente. Se questo è consigliabile, ci sono delle catture che dovrei essere a conoscenza in uno scenario del genere?

EDIT:

ho la sensazione mia domanda non era abbastanza chiaro, quindi ho intenzione di cercare di aggiungere un concreto, seppur esempio truccata.

Diciamo che devo leggere un file di grandi dimensioni ogni 2 minuti, e quando ho finito, devo aggiungere un elemento a un ListBox. Diciamo che leggere/elaborare il file richiede 10-15 secondi, durante i quali non faccio funzionare l'interfaccia utente. Quale sarebbe l'approccio migliore per qualcosa di simile?

risposta

2

Dopo alcune ricerche e analisi, sono giunto alla conclusione che un timer regolare funziona meglio nel mio esempio inventato. Finora, non ho dovuto cercare qualcosa di specifico che potesse causare potenziali problemi nel mio codice. Detto questo, le buone pratiche di codifica non fanno mai male!

1
  • Timer genera eventi ricorrenti in un'applicazione

  • DispatcherTimer è un temporizzatore che è integrato nella coda dispatcher che viene elaborato in un determinato intervallo di tempo e ad una priorità specificata .

I timer non possono essere eseguiti esattamente quando si verifica l'intervallo di tempo, ma è garantito che non vengano eseguiti prima che si verifichi l'intervallo di tempo. Questo perché le operazioni di DispatcherTimer vengono posizionate nella coda del Dispatcher come altre operazioni. Quando l'operazione DispatcherTimer viene eseguita, dipende dagli altri lavori nella coda e dalle loro priorità.

Se un timer viene utilizzato in un WPF application, vale la pena notare che lo Timer runs on a different thread then the user interface (UI) thread. Per accedere agli oggetti sul thread dell'interfaccia utente (UI), è necessario pubblicare l'operazione sul Dispatcher del thread dell'interfaccia utente (UI) utilizzando Invoke o BeginInvoke. I motivi per l'utilizzo di DispatcherTimer opposti a un timer sono che DispatcherTimer viene eseguito sullo stesso thread del Dispatcher e che è possibile impostare DispatcherPriority.

+1

Forse dovrei chiarire la mia domanda, ma so già che un timer gira su un thread separato, e che in questo caso è richiesto a un Dispatcher di toccare l'interfaccia utente. Ero più curioso di sapere quando valesse la pena usare un Timer in un'applicazione WPF anche quando devo toccare l'interfaccia utente. –

0

Se si desidera modificare un valore scalare (non una raccolta) associato all'elemento dell'interfaccia utente, è possibile farlo non solo dal thread dell'interfaccia utente (ad esempio dal delegato del timer). E in questo caso non è necessario utilizzare Dispatcher.Invoke/BeginInvoke.

0

Un'altra opzione è utilizzare DispatcherTimer con la creazione dell'istanza della classe BackgroundWorker su ciascuna iterazione del timer. In molti casi ti libera anche dall'uso di Dispatcher.Invoke/BeginInvoke.

+0

Sono a conoscenza delle mie opzioni :). Sto cercando alcune informazioni su quale sia l'opzione * ideale *. –

5

Punto principale:

per eseguire venire computazionalmente intensive compito

Ciò indicherebbe non utilizzando il DispatcherTimer. Esiste principalmente per eseguire piccole attività sul thread principale ed evitare di creare un altro thread.

Se si utilizza un DispatcherTimer per avviare un Backgroundworker si sta aggirando il suo scopo principale.

Quindi basta usare un timer normale qui.

+0

C'è qualcosa di cui dovrei essere a conoscenza quando uso un timer normale? Ricordo di aver letto da qualche parte che gli elementi dell'interfaccia utente potrebbero dover essere bloccati, ma non sono sicuro che sia necessario/vero. –

+1

Sì, è necessario Dispatcher.Invoke() durante l'aggiornamento della GUI. Come di solito. –

1

Comparing Timer with DispatcherTimer Alcune risposte pubblicate qui sono più specifiche per la tua domanda, ma penso che questo link offra alcune informazioni e consigli generali.