2010-06-18 18 views
12

¿Alguien puede decirme cuándo usar un Dispatcher y cuándo usar la clase SynchronizationContext?Dispatcher y clases de SynchronizationContext

Desde hace un tiempo uso el Dispatcher para poner en cola tareas de un hilo de fondo, luego descubrí el SynchronizationContext.

Respuesta

16

AFAIK, al utilizar WPF, el objeto SynchronizationContext.Current es de tipo DispatcherSynchronizationContext que es en realidad sólo una envoltura alrededor del objeto Dispatcher y los métodos Post y Send simplemente delegan en Dispatcher.BeginInvoke y Dispatcher.Invoke.

Así que incluso si decides usar SynchronizationContext, creo que terminas llamando despachador detrás de escena.

Además, creo que es un poco engorroso usar SynchronizationContext ya que debe pasar una referencia al contexto actual a todos los hilos que necesitan llamar a su UI.

+3

¿Por qué el voto a favor? –

4
  1. Utilice Dispatcher cuando su código esté estrechamente acoplado a WPF.

  2. Utilice AsyncOperationManager cuando necesite poner algo en cola en el subproceso 'Contexto'. Esto también funciona con las aplicaciones Windows Forms, ASP .NET y WCF.

  3. Evite utilizar el SynchronizationContext usted mismo. El AsyncOperationManager usa este mecanismo internamente.

+0

Me doy cuenta de que ha escrito esta respuesta hace algún tiempo. Sin embargo, me interesaría mucho si pudiera proporcionar un ejemplo concreto de cómo usar 'AsyncOperationManager' para poner en cola a un delegado para su ejecución en el hilo de" contexto "(UI). Sé cómo funciona 'SynchronizationContext'; pero no puedo entender cómo se supone que 'AsyncOperation' funcione. (Actualmente tengo la idea de que es más como un "token" para hacer un seguimiento del estado y el progreso de una operación asíncrona, pero no ayudará con la programación de un delegado para su ejecución). – stakx

+1

Cómo usar AsyncOperationManager: http: // www .codeproject.com/KB/cpp/SyncContextTutorial.aspx – jbe

+0

¿Qué sucede si necesita ejecutar de forma síncrona algo en el hilo de la interfaz de usuario? AsyncOperation no tiene un método Send() pero SynchronizationContext sí ​​lo tiene. – Monstieur

Cuestiones relacionadas