.net wpf dispatcher

.net - Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher



dispatcher c# (3)

¿Cuáles son las diferencias entre Dispatcher.CurrentDispatcher (en System.Windows.Threading ) y Application.Current.Dispatcher (en System.Windows )?

Mi instinto me dice que Application.Current.Dispatcher nunca cambiará y que es global para todos los hilos en la aplicación actual, mientras que Dispatcher.CurrentDispatcher puede crear una nueva instancia de Dispatcher dependiendo del hilo desde el que se invocó.

¿Es eso correcto?

Si es así, ¿el propósito de Dispatcher.CurrentDispatcher principalmente para la interfaz de usuario de subprocesos múltiples?


Mi instinto me dice que Application.Current.Dispatcher nunca cambiará y que es global para todos los hilos en la aplicación actual, mientras que Dispatcher.CurrentDispatcher puede crear una nueva instancia de Dispatcher dependiendo del hilo desde el que se invocó.

Eso es correcto, Application.Current.Dispatcher es una propiedad de instancia de la aplicación que se asigna en la construcción para ser el despachador del hilo actual. Y como señala la documentación de Dispatcher.CurrentDispatcher :

Obtiene el despachador para el subproceso que se está ejecutando actualmente y crea un nuevo Dispatcher si uno no está ya asociado con el subproceso.

Si es así, ¿el propósito de Dispatcher.CurrentDispatcher es principalmente para la interfaz de usuario de subprocesos múltiples?

Posiblemente, no he encontrado ningún uso para obtener el despachador de un hilo de fondo, ya que generalmente no tiene elementos de UI a los que le gustaría despachar operaciones.


Mi instinto me dice que Application.Current.Dispatcher nunca cambiará y que es global para todos los hilos en la aplicación actual, mientras que Dispatcher.CurrentDispatcher puede crear una nueva instancia de Dispatcher dependiendo del hilo desde el que se invocó.

Eso es correcto.

Además, no tiene sentido acceder a Dispatcher.CurrentDispatcher desde un hilo que no sea UI. No hará nada a menos que llame a Dispatcher.Run , y entrar en un bucle de mensaje infinito no es lo que desea hacer desde dentro de los subprocesos de trabajo.

Asi que:

  • En el escenario más común , donde su aplicación solo tiene un único subproceso de interfaz de usuario, Application.Current.Dispatcher y Dispatcher.CurrentDispatcher desde dentro del subproceso de la interfaz de usuario devolverán la misma instancia. Cuál de ustedes es simplemente una cuestión de preferencia.

  • Si su aplicación tiene más de un subproceso de interfaz de usuario, cada DispatcherObject se asociará permanentemente con el despachador del subproceso de interfaz de usuario que se creó en el momento de la construcción. En este caso, Application.Current.Dispatcher se referirá al despachador de la secuencia generada por su aplicación; no podrá usarlo para publicar mensajes en controles propiedad de sus otros hilos de UI.


Para hacerlo mas simple...

Dispatcher.CurrentDispatcher obtiene el despachador para el hilo actual . Por lo tanto, si está buscando el despachador del subproceso de interfaz de usuario de un proceso en segundo plano, no lo use.

Application.Current.Dispatcher siempre le dará el despachador del subproceso UI, ya que este es el hilo que activa la única instancia de la Aplicación.