2011-12-20 40 views
9

Estoy trabajando en un proyecto que utiliza las siguientes tecnologías:Cómo invocar un método en el subproceso de interfaz de usuario desde dentro de un subproceso de trabajo?

  • C# (.NET 4.0)
  • WCF
  • PRISM 4

actualmente estoy haciendo una llamada asincrónica a uno de nuestros servicios web utilizando los métodos Begin/End generados por un proxy. La llamada fue exitosa y el cliente puede recibir la respuesta del servicio web en un hilo de trabajo.

Una vez que se recibe la respuesta, procedo a plantear un evento. La clase suscrito al evento procede a solicitar una navegación de interfaz de usuario mediante PRISM:

Application.Current.Dispatcher.BeginInvoke(new Action(() => 
    this.RegionManager.RequestNavigate(RegionNames.LoginContentRegion, projectSelectionViewUri))); 

Puesto que la respuesta WCF asíncrono no se captura en el subproceso de interfaz de usuario, que estoy obligado a invocar el hilo de interfaz de usuario mediante Application.Current.Dispatcher.BeginInvoke(...).

El problema aquí es que la invocación parece no hacer nada. La interfaz de usuario no se actualiza y no se lanza ninguna excepción.

¿Cómo debo invocar el subproceso de interfaz de usuario desde un evento que se genera en un subproceso de trabajo?

Editar: Esta pregunta ha sido re-pedido en el siguiente enlace, ya que la supuesta duplicado no proporciona una respuesta:

Request UI navigation using PRISM 4 on an asynchronous WCF response thread

+2

¿Por qué se cerró este hilo? El posible duplicado no trata con WPF Windows, y tiene casi 3 años, entiendo que este es un tema común (en todo el sitio) pero el posible duplicado como NADA de Incommon. –

+0

Estoy de acuerdo con Ramhound ... –

Respuesta

5

Usted necesita asegurarse de que está invocando en la interfaz de usuario real Dispatcher , no necesariamente el Current. Puede intentar pasar en la IU Dispatcher, o tener algún tipo de devolución de llamada que será manejado por la IU en algún lugar.

+0

¿Qué debo hacer para pasar el Despachador de UI? –

+1

Suponiendo que crea la clase que lo requiere desde algún elemento de UI (es decir, un 'UserControl'), puede hacer algo como:' var someClass = new SomeClass (this.Dispatcher); '. –

+0

@HusseinKhalil - ¿No puedes enviar una referencia de la ventana principal? –

Cuestiones relacionadas