Asegurar que las cosas se ejecuten en el hilo de la interfaz de usuario en WPF

Estoy construyendo una aplicación WPF. Estoy haciendo alguna comunicación asincrónica con el lado del servidor, y uso la agregación de eventos con Prism en el cliente. Ambas cosas dan como resultado que se generen nuevos subprocesos que no son el subproceso de la interfaz de usuario. Si intento hacer "operaciones WPF" en estos hilos de devolución de llamada y manejador de eventos, el mundo se vendrá abajo, lo que ahora ha comenzado a hacer.

Primero encontré problemas al intentar 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 de la interfaz de usuario en un controlador de eventos Prism, y me dicen que:

La persona que llama no puede acceder a este hilo porque lo posee un hilo diferente.

Entonces;¿Cuál es la clave para hacer las cosas bien en WPF? He leído sobre el WPF Dispatcher enesta publicación de MSDN. Estoy empezando a entenderlo, pero todavía no soy un mago.

¿Es la clave usar siempre Dispatcher.Invoke cuando necesito ejecutar algo que no estoy seguro se llamará en el hilo de la interfaz de usuario?¿Importa si realmente se invocó en el hilo de la interfaz de usuario, y hago Dispatcher.Invoke de todos modos?Dispatcher.Invoke = sincrónicamente. Dispathcher.BeginInvoke = asíncrono?¿Dispatcher.Invoke solicitará el subproceso de interfaz de usuario y luego se detendrá para esperarlo? ¿Es una mala práctica y riesgo de programas menos receptivos?¿Cómo consigo el despachador de todos modos? ¿Dispatcher.CurrentDispatcher siempre me dará el despachador que representa el hilo de la interfaz de usuario?¿Existirá más de un Dispatcher o "Dispatcher" es básicamente el mismo que el subproceso de interfaz de usuario de la aplicación?¿Y cuál es el trato con el BackgroundWorker? ¿Cuándo uso esto en su lugar? Supongo que esto siempre es asíncrono?¿Todo lo que se ejecuta en el subproceso de la interfaz de usuario (al ser invocado) se ejecutará en modo apartamento STA? Es decir. si tengo algo que requiere ejecutarse en modo STA, ¿será suficiente Dispatcher.Invoke?

¿Alguien quiere aclararme las cosas? ¿Alguna recomendación relacionada, etc.? ¡Gracias!

Respuestas a la pregunta(1)

Su respuesta a la pregunta