Ho un FileSystemWatcher che reagiscono ai cambiamenti del caso.
Voglio aprire il file, leggere la visualizzazione del contenuto in una textbox e nascondere il pop-up che è stato creato dopo 1 sec. Il codice quasi un lavoro, ma qualcosa di non riuscire quando si nasconde il popup.
Ecco un frammento di codice :
txtLog.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)delegate() {
this.txtLog.Text = dataToDisplay;
extendedNotifyIcon_OnShowWindow();
Thread threadToClosePopup = new Thread(new ThreadStart((Action)delegate() {
Thread.Sleep(1000);
extendedNotifyIcon_OnHideWindow();
}));
threadToClosePopup.Start();
});
Come si può vedere, io uso la Invocare per impostare il testo in quanto l’evento è in un altro thread (FileSystemWatcher). Ma per nascondere le finestre la extendedNotifyIcon_OnHideWindow() non viene eseguito nel thread dell’interfaccia grafica. Come posso eseguire nel thread della GUI?
OriginaleL’autore Patrick Desjardins | 2010-09-15
Per eseguire il
extendedNotifyIcon_OnHideWindow
metodo sul thread della GUI utilizzare ilDispatcher
come avete fatto per la mostra.OriginaleL’autore JaredPar
Questo funziona bene per
WPF
conMVVM
.Questo non lavoro in modo coerente (avrà esito negativo se siamo all’interno di un gestore per Reattiva Estensioni):
Extra per gli Esperti: Il Motivo?
Dal progetto, qualsiasi thread può avere un dispatcher thread associato, vedere MSDN: Classe Dispatcher.
Se facciamo riferimento a
Dispatcher.CurrentDispatcher
da qualsiasi thread, possa effettivamente creare un nuovo thread del dispatcher, che è separato ufficiale WPF UI dispatcher thread. Quando si tenta di eseguire il codice appena creato dispatcher thread, WPF buttare in quanto non è ufficiale UI dispatcher thread.La soluzione è di usare sempre
Application.Current.Dispatcher.Invoke()
, oApplication.Current.Dispatcher.BeginInvoke()
. Vedere Qual è la differenza tra Invoke() e BeginInvoke().Testato su:
WPF
.NET 4.5
.NET 4.6
.NET 4.61
Sei il benvenuto. Aggiornato questo post per aggiungere il motivo per cui questo si verifica.
OriginaleL’autore Contango
Questo vi darà la Finestra dispatcher:
Come lungo come si ottiene il thread di windows.
OriginaleL’autore ozczecho
Controllo.Richiamare
OriginaleL’autore Alex Reitbort
Basta avvolgere
extendedNotifyIcon_OnHideWindow();
in unDispatcher.Invoke()
Ma preferisco farlo (tutti im XAML) con un’Animazione e con un EvenTrigger che innesca sulla TimeLine.Evento compiuto.
OriginaleL’autore bitbonk
Il problema è che
extendedNotifyIcon_OnHideWindow
viene eseguito su un thread diverso il thread dell’interfaccia utente. Sarà necessario utilizzare ilDispatcher
per quella parte. Inoltre, non vorrei creare un thread dedicato solo attendere un secondo. Si può facilmente effettuare il refactoring, a parte unSystem.Threading.Timer
. Qui è il mio refactoring versione.OriginaleL’autore Brian Gideon