.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
yDispatcher.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.