Zuerst ein bisschen Hintergrund: Ich habe eine WPF-Anwendung, die eine GUI-Front-End zu einer älteren Win32-Anwendung ist. Die Legacy-App wird als DLL in einem separaten Thread ausgeführt. Die Befehle, die der Benutzer in der Benutzeroberfläche auswählt, werden in diesem "Legacy-Thread" aufgerufen.Application.Current.Shutdown() vs. Application.Current.Dispatcher.BeginInvokeShutdown()
Wenn der "Legacy-Thread" beendet ist, kann das GUI-Frontend nichts mehr tun, deshalb muss ich die WPF-Anwendung herunterfahren. Daher rufe ich am Ende der Methode des Threads Application.Current.Shutdown()
.
Da ich nicht auf dem Hauptthread bin, muss ich diesen Befehl aufrufen. Allerdings habe ich dann bemerkt, dass der Dispatcher auch BeginInvokeShutdown()
hat, um den Dispatcher abzuschalten. Also meine Frage ist: Was ist der Unterschied
Application.Current.Shutdown();
zwischen Aufruf und ruft
Application.Current.Dispatcher.BeginInvokeShutdown();
Nun, das ist genau die Frage, die in der Dokumentation nicht beantwortet wird: Schaltet das Herunterfahren der Anwendung Dispatcher auch die Anwendung herunter? –
Ich habe dafür eine einfache WPF-Testanwendung erstellt. Um Ihren Code zu simulieren, habe ich: 'Thread t = neuer Thread (neuer ThreadStart (delegate() {Thread.Sleep (50000);})); t.Start(); Application.Current.Dispatcher .BeginInvokeShutdown (System.Windows.Threading.DispatcherPriority.Normal); '. Der Dispatcher-Shutdown hat seinen Besitzer-Thread beendet und das Fenster geschlossen, aber * hat * den Hintergrund-Thread nicht beendet. – JustABill
Zwei kleine Unterschiede: 1) Ich rufe Shutdown im zweiten Thread auf (obwohl ich durch Tests sehe, dass es keinen Unterschied macht). 2) Ich habe den zweiten Thread als Hintergrund-Thread (IsBackground = true) festgelegt. Auf diese Weise wird es auch getötet, wenn der Haupt-Thread beendet wird. –