Estoy compilando una aplicación WPF. Estoy haciendo una comunicación asíncrona con el lado del servidor, y utilizo la agregación de eventos con Prism en el cliente. Ambas cosas dan como resultado que se engendren nuevos hilos que no son el hilo de UI. Si intento hacer "operaciones WPF" en estos hilos de devolución de llamada y manejador de eventos, el mundo se derrumbará, lo que ahora ha comenzado a hacer.Asegurándome de que todo se ejecute en el subproceso UI en WPF
Primero encontré problemas al tratar de crear algunos objetos WPF en la devolución de llamada desde el servidor. Me dijeron que el hilo necesitaba ejecutarse en modo STA. Ahora estoy tratando de actualizar algunos datos UI en un controlador de eventos Prism, y me dijeron que:
El llamante no puede acceder a este hilo porque lo posee un hilo diferente.
So; ¿Cuál es la clave para hacer las cosas bien en WPF? He leído en el Despachador de WPF en this MSDN post. Estoy empezando a obtenerlo, pero todavía no soy un mago.
- es la clave para utilizar siempre Dispatcher.Invoke cuando necesito para ejecutar algo que no estoy seguro de que será llamado en el subproceso de interfaz de usuario?
- ¿Importa si realmente se llamó en el hilo de la interfaz de usuario, y lo hago Dispatcher.Invoke de todos modos?
- Dispatcher.Invoke = sincrónico. Dispathcher.BeginInvoke = async?
- Will Dispatcher.Invoke solicita el hilo de UI y luego se detiene para esperarlo? ¿Es una mala práctica y el riesgo de programas menos receptivos?
- ¿Cómo obtengo el despachador de todos modos? Will Dispatcher.CurrentDispatcher siempre me da el despachador que representa el hilo de UI?
- ¿Existirá más de un despachador, o es "Dispatcher" básicamente el mismo que el subproceso de interfaz de usuario para la aplicación?
- ¿Y cuál es el problema con BackgroundWorker? ¿Cuándo uso esto en su lugar? ¿Supongo que esto siempre es asincrónico?
- ¿Todo lo que se ejecuta en el subproceso de la interfaz de usuario (al ser invocado) se ejecutará en el modo de apartamento STA? Es decir. si tengo algo que requiera que se ejecute en modo STA, ¿será suficiente Dispatcher.Invoke?
¿Alguien quiere aclarar las cosas para mí? ¿Alguna recomendación relacionada, etc.? ¡Gracias!
Muchas gracias Charlie! ¡Esto es realmente esclarecedor y útil! – stiank81
Agregó una 8va pregunta a la lista. Espero que puedas actualizar tu respuesta para incluirla :-) – stiank81
Haha editado para responder a tu pregunta final. – Charlie