2010-06-18 3 views
12

Quelqu'un peut-il me dire quand utiliser un Dispatcher et quand utiliser la classe SynchronizationContext?Dispatcher et classes SynchronizationContext

Depuis quelque temps j'utilise le Dispatcher pour mettre en file d'attente des tâches à partir d'un fil de fond, puis j'ai découvert le SynchronizationContext.

Répondre

16

AFAIK, lorsque vous utilisez WPF, l'objet SynchronizationContext.Current est de type DispatcherSynchronizationContext qui est en fait juste une enveloppe autour de l'objet Dispatcher et les méthodes Post et Send délèguent juste Dispatcher.BeginInvoke et Dispatcher.Invoke.

Donc, même si vous décidez d'utiliser SynchronizationContext je pense que vous finissez par appeler le répartiteur dans les coulisses. En outre, je pense qu'il est un peu difficile d'utiliser SynchronizationContext car vous devez passer une référence au contexte actuel à tous les threads qui doivent appeler dans votre interface utilisateur.

+3

Pourquoi le downvote? –

4
  1. Utilisez Dispatcher lorsque votre code est étroitement couplé à WPF.

  2. Utilisez AsyncOperationManager lorsque vous avez besoin de mettre en file d'attente quelque chose dans le thread 'Contexte'. Cela fonctionne également avec les applications Windows Forms, ASP .NET et WCF.

  3. Évitez d'utiliser le SynchronizationContext vous-même. L'AsyncOperationManager utilise ce mécanisme en interne.

+0

Je réalise que vous avez écrit cette réponse il y a quelque temps. Néanmoins, je serais très intéressé si vous pouviez fournir un exemple concret comment utiliser 'AsyncOperationManager' pour mettre en file d'attente un délégué pour exécution sur le thread" context "(UI). Je sais comment 'SynchronizationContext' fonctionne; mais je ne peux pas comprendre comment 'AsyncOperation' est censé fonctionner. (J'ai actuellement l'idée que c'est plutôt comme un "jeton" pour garder trace de l'état et de la progression d'une opération asynchrone, mais cela ne va pas aider à planifier un délégué pour exécution.) – stakx

+1

Comment utiliser AsyncOperationManager: http: // www .codeproject.com/KB/cpp/SyncContextTutorial.aspx – jbe

+0

Que faire si vous avez besoin d'exécuter de manière synchrone quelque chose sur le thread de l'interface utilisateur? AsyncOperation n'a pas de méthode Send() mais SynchronizationContext. – Monstieur