2010-06-18 6 views
12

Qualcuno può dirmi quando utilizzare Dispatcher e quando utilizzare la classe SynchronizationContext?Classi Dispatcher e SynchronizationContext

Per un po 'di tempo ho utilizzato il Dispatcher per accodare le attività da un thread in background, quindi ho scoperto lo SynchronizationContext.

risposta

16

AFAIK, quando si utilizza WPF, l'oggetto SynchronizationContext.Current è di tipo DispatcherSynchronizationContext che è in realtà solo un involucro intorno all'oggetto Dispatcher ei metodi Post e Send solo delegano a Dispatcher.BeginInvoke e Dispatcher.Invoke.

Quindi, anche se si decide di utilizzare SynchronizationContext, penso che si finisce per chiamare il dispatcher dietro le quinte.

Inoltre, penso che sia un po 'complicato utilizzare SynchronizationContext in quanto è necessario passare un riferimento al contesto corrente a tutti i thread che devono chiamare nell'interfaccia utente.

+3

Perché il downvote? –

4
  1. Utilizzare il Dispatcher quando il codice è strettamente collegato a WPF.

  2. Utilizzare AsyncOperationManager quando è necessario accodare qualcosa nel thread "Contesto". Funziona anche con le applicazioni Windows Form, ASP .NET e WCF.

  3. Evitare di utilizzare il SynchronizationContext. AsyncOperationManager utilizza questo meccanismo internamente.

+0

Mi rendo conto che hai scritto questa risposta qualche tempo fa. Tuttavia, sarei molto interessato se potessi fornire un esempio concreto su come usare 'AsyncOperationManager' per mettere in coda un delegato per l'esecuzione sul thread" context "(UI). So come funziona 'SynchronizationContext'; ma non riesco a capire come si suppone che 'AsyncOperation' funzioni. (Al momento ho l'idea che sia un po 'come un "token" per tenere traccia dello stato e dei progressi dell'operazione asincrona, ma non aiuta a pianificare effettivamente un delegato per l'esecuzione.) – stakx

+1

Come usare AsyncOperationManager: http: // www .codeproject.com/KB/cpp/SyncContextTutorial.aspx – jbe

+0

E se fosse necessario eseguire qualcosa in modo sincrono sul thread dell'interfaccia utente? AsyncOperation non ha un metodo Send() ma SynchronizationContext. – Monstieur