2012-03-31 19 views
7

Nella mia applicazione WPF Sto caricando contenuti utilizzando Dispatcher.BeginInvoke nel costruttore. La mia domanda è che bloccherà il thread dell'interfaccia utente?Qual è la differenza tra Dispatcher.BeginInvoke e Task.Factory.StartNew

Oppure è meglio utilizzare Task.Factory.StartNew e quindi reinstradare le cose sull'interfaccia utente in modo che l'applicazione venga caricata prima indipendentemente dal tempo di elaborazione del contenuto di caricamento?

quale sia il migliore approccio e perché?

risposta

20

Fanno due cose molto diverse:

  • Task.Factory.StartNew pianifica un delegato per l'esecuzione su un thread piscina thread. Il thread corrente continua a essere eseguito senza attendere il risultato di questa attività (async). Generalmente si genera un task in background più lungo in modo che l'interfaccia utente non sia bloccata troppo a lungo (non "congelata").

  • Dispatcher.BeginInvoke pianifica un delegato per l'esecuzione sul thread dispatcher (UI) . Tipicamente questo è fatto per aggiornare alcune UI controlla con i risultati di alcune operazioni che è stata eseguita su un thread sfondo. In sostanza stai aggiornando l'interfaccia utente qui.

di rispondervi domande direttamente:

Non si dovrebbe pianificare le operazioni lunghe sul filo Dispatcher, tipicamente desideri solo aggiornare controlli dell'interfaccia utente qui. Il codice nel delegato verrà eseguito sul thread dell'interfaccia utente, che viene bloccato per il tempo dell'esecuzione. Basta mettere un Thread.Sleep(10000) nel codice corrente (che si pianifica dal costruttore) e vedrete l'interfaccia utente si blocca. Utilizza un'attività in background per questo: con un Task o un worker in background (entrambi utilizzeranno un thread pool di thread).

o è meglio utilizzare Task.Factory.StartNew e poi dispacciamento le cose sul interfaccia utente in modo che l'applicazione verrà caricata prima indipendentemente il tempo di processo di caricamento dei contenuti.

Sì!

+0

Grazie per la risposta, Dispatcher.BeginInvoke bloccherà l'interfaccia utente ... nella mia app. Ho bisogno di chiamare alcuni servizi durante il caricamento e se il servizio è fermo allora si blocca l'interfaccia utente anche se ho usato Dispatcher.BeginInvoke quindi la mia domanda di base è quella di utilizzare dispatcher o attività in questo caso? –

+2

se volete qualcosa in esecuzione in * * sfondo utilizzare un'attività, se si desidera inviare i risultati per l'utilizzo dell'interfaccia utente 'Dispatcher.BeginInvoke' – BrokenGlass

Problemi correlati