2010-04-17 1 views
12

Ho un'applicazione WPF in cui un thread controlla un valore. In alcuni casi, mostro un pop-up Window per visualizzare un messaggio. Quando creo questa finestra pop-up nel thread, viene generata un'eccezione dal costruttore del finestra pop-up:"Il thread chiamante deve essere STA, perché molti componenti dell'interfaccia utente richiedono questo" errore durante la creazione di una finestra popup WPF nella discussione

"Il thread chiamante deve essere STA, perché molti componenti dell'interfaccia utente richiedono questo."

Come posso risolvere questo errore?

Questo è il mio codice per creare la finestra pop-up:

// using System.Threading; 
// using System.Windows.Threading; 
Thread Messagethread = new Thread(new ThreadStart(delegate() 
{ 
    DispatcherOperation DispacherOP = 
     frmMassenger.Dispatcher.BeginInvoke(
      DispatcherPriority.Normal, 
      new Action(delegate() 
      { 
       frmMassenger.Show(); 
      })); 
})); 
Messagethread.Start(); 
+1

ho trovato problema alla radice. Ho un timer che in ogni timer.tick, controlla i nuovi messaggi e poi mostra ogni nuovo messaggio. Il thread del timer rende il mio lavoro così difficile. – Rev

+1

Off-topic: In WPF, le finestre sono chiamate semplicemente: "windows"; non "forme". Quest'ultimo termine è utilizzato in un altro framework UI, Windows Form. – stakx

+0

@stakx: Grazie – Rev

risposta

9

Assolutamente Dispatcher è unico modo per fare qualcosa (in particolare Thread) quando lavoriamo con il multi-threading in WPF!

Ma per il lavoro con Dispatcher dobbiamo sapere 2 cose:

modo
  1. Troppi per utilizzare Dispatcher come Dispatcher_Operation, [window.dispatcher] o ecc
  2. Dobbiamo call dispatcher in the main thread of app (quel filo è deve essere STA filo)

Così, per esempio: se vogliamo mostrare altre finestra [WPF] in un altro thread, possiamo usare questo codice:

Frmexample frmexample = new Frmexample(); 
      Frmexample .Dispatcher.BeginInvoke 
       (System.Windows.Threading.DispatcherPriority.Normal, 
       (Action)(() => 
       { 
        frmexample.Show(); 
        //---or do any thing you want with that form 
       } 
       )); 

Suggerimento:Remember - we can't access any fields or properties from out dispatcher, so use that wisely

13

Per la vostra discussione che si sta cercando di avviare l'elemento GUI in, è necessario impostare lo stato appartamento del thread per STA PRIMA di si avvia.

Esempio:

myThread.SetApartmentState(ApartmentState.STA); 
myThread.Start(); 
+0

@Rev: fammi sapere, se non supera il tuo errore fammi sapere il messaggio di errore e ti fornirò le informazioni aggiuntive che ti servono. Penso che sia tutto ciò di cui avrai bisogno. –

+0

thx per aiuto ma quello non funziona. questo problema relativo a Wpf e Threading. Penso che dovremmo usare Dispatcher per risolverlo. Saluti Rev – Rev

+2

@Rev: Probabilmente hai 2 problemi. Il threading STA e il dispatcher. Se vuoi aiuto con il dispatcher fammelo sapere e posso mostrarti come. –