2011-12-20 2 views
9

Sto lavorando su un progetto che utilizza le seguenti tecnologie:Come richiamare un metodo sul thread dell'interfaccia utente da un thread di lavoro?

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

Attualmente sto facendo una chiamata asincrona a uno dei nostri servizi Web utilizzando i metodi Begin/End generati da un proxy. La chiamata ha esito positivo e il client è in grado di ricevere la risposta del servizio Web su un thread di lavoro.

Una volta ricevuta la risposta, procedo a generare un evento. La classe sottoscritto l'evento procede richiedere un Prism navigazione UI utilizzando:

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

Poiché la risposta asincrona WCF non viene catturato nel thread UI, sono costretto a richiamare il thread UI utilizzando Application.Current.Dispatcher.BeginInvoke(...).

Il problema qui è che il richiamo sembra non fare nulla. L'interfaccia utente non viene aggiornata e non viene generata alcuna eccezione.

Come dovrei richiamare il thread dell'interfaccia utente all'interno di un evento che viene generato su un thread di lavoro?

Edit: Questa domanda è stato ri-chiesto al seguente link, in quanto il presunto duplicato non fornisce una risposta:

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

+2

Perché questo thread è stato chiuso. Il possibile duplicato non ha a che fare con Windows WPF, e ha quasi 3 anni, ho capito che questo è un argomento comune (a livello di sito) ma il possibile duplicato come NOTHING incommon. –

+0

Concordo con Ramhound ... –

risposta

5

È necessario assicurarsi che si sta invocando sul reale UI Dispatcher , non necessariamente lo Current. Potresti provare a passare nell'interfaccia utente Dispatcher o avere qualche forma di callback che verrà gestita dall'interfaccia utente da qualche parte.

+0

Come dovrei passare per passare l'UI Dispatcher? –

+1

Supponendo che tu crei la classe che lo richiede da qualche elemento UI (ad esempio un 'UserControl'), puoi fare qualcosa del tipo: 'var someClass = new SomeClass (this.Dispatcher);'. –

+0

@HusseinKhalil - Non puoi inviare un riferimento della finestra principale? –