Ho un'applicazione WPF piuttosto complessa che sembra "sospesa" o si blocca in una chiamata di attesa quando si tenta di utilizzare il dispatcher per richiamare una chiamata sul thread dell'interfaccia utente.WPF Dispatcher.Invoke 'sospeso'
Il processo generale è:
- gestire l'evento clic su un pulsante
- creare un nuovo thread (STA), che: crea una nuova istanza del presentatore e interfaccia utente, quindi chiama il Disconnect metodo
- Disconnect imposta poi una proprietà sulla UI chiamato Nome
- il setter per nome, allora utilizza il seguente codice per impostare la proprietà:
if(this.Dispatcher.Thread != Thread.CurrentThread)
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate{
this.Name = value; // Call same setter, but on the UI thread
});
return;
}
SetValue(nameProperty, value); // I have also tried a member variable and setting the textbox.text property directly.
Il mio problema è che quando il dispatcher invocare metodo viene chiamato sembra bloccarsi ogni volta, e lo stack di chiamate indica che il suo in un sonno, attendere o partecipare nell'ambito dell'attuazione Invoke.
Quindi, c'è qualcosa che sto facendo male che mi manca, ovvio o no, o c'è un modo migliore di chiamare attraverso il thread dell'interfaccia utente per impostare questa proprietà (e altri)?
Edit: La soluzione fu di chiamare System.Windows.Threading.Dispatcher.Run() alla fine del delegato filo (ad esempio dove veniva eseguito il lavoro) - Grazie a tutti coloro che hanno contribuito.
@Matthew: in realtà, non c'è nulla di "non ottimale" su BeginInvoke; se non hai assolutamente bisogno di un aggiornamento * ora *, va bene. È necessario essere un po 'cauti sulle variabili acquisite, anche se (non modificare il "valore" dopo aver chiamato BeginInvoke.) –
@Matthew - you do not Join() il nuovo thread, vero? Questo lo spiegherebbe ... –
@Marc Gravell - a memoria, stavo unendo il filo ad un certo punto, ma non sono sicuro che il comportamento fosse lo stesso quando non lo stavo usando. Il motivo del join è che volevo bloccare il resto dell'app fino al completamento del lavoro, ma forse posso usare un'alternativa. –