Prima un po 'di background: ho un'applicazione WPF, che è una GUI front-end per un'applicazione legacy Win32. L'app legacy viene eseguita come DLL in un thread separato. I comandi che l'utente sceglie nell'interfaccia utente vengono richiamati su quel "thread legacy".Application.Current.Shutdown() vs. Application.Current.Dispatcher.BeginInvokeShutdown()
Se il "thread legacy" termina, la GUI-front-end non può più fare nulla di utile, quindi ho bisogno di chiudere l'applicazione WPF. Pertanto, alla fine del metodo del thread, chiamo Application.Current.Shutdown()
.
Poiché non sono sul thread principale, devo richiamare questo comando. Tuttavia, ho notato che il Dispatcher ha anche BeginInvokeShutdown()
per arrestare il dispatcher. Quindi la mia domanda è: Qual è la differenza tra invocando
Application.Current.Shutdown();
e chiamando
Application.Current.Dispatcher.BeginInvokeShutdown();
Bene, questa è esattamente la domanda alla quale non viene data risposta nella documentazione: La chiusura del dispatcher dell'applicazione spegne anche l'applicazione? –
Per questo ho creato una semplice applicazione di test WPF. Per simulare il tuo codice, ho fatto: 'Thread t = new Thread (new ThreadStart (delegate() {Thread.Sleep (50000);})); t.Start(); Application.Current.Dispatcher .BeginInvokeShutdown (System.Windows.Threading.DispatcherPriority.Normal); '. L'arresto del Dispatcher ha ucciso il suo thread proprietario e ha chiuso la finestra, ma * non * ha ucciso il thread in background. – JustABill
Due piccole differenze: 1) chiamo shutdown nel secondo thread (anche se attraverso i test posso vedere che non fa differenza). 2) Ho il secondo thread impostato come thread in background (IsBackground = true). In questo modo, viene anche ucciso se il thread principale si chiude. –