2009-12-08 3 views
6

Titel ist darüber. WPF-App mit einigen WCF-Sachen für IPC. Ich rufe Application.Current.Shutdown() und die App geht weiter glücklich. Ich dachte, Shutdown sollte nicht aufzuhalten sein.Application.Current.Shutdown() nicht

Vielleicht, weil es von einem Hintergrund-Thread aufgerufen wird? Muss ich ein Dispatcher fiedeln?

Antwort

12

Sie erhalten eine Ausnahme, wenn ich Application.Current.Shutdown in einem anderen Thread als dem Hauptanruf aufrufen, also würde ich davon ausgehen, dass Sie "dispatcher giddling" bereits richtig verwenden.

In jedem Fall ist diese kompiliert und beendet eine Anwendung, so dass, wenn der Disponent Bit sieht nicht so aus, was Sie haben Sie es im Riemen könnte:

ThreadStart ts = delegate() 
    { 
     Dispatcher.BeginInvoke((Action)delegate() 
     { 
      Application.Current.Shutdown(); 
     }); 
    }; 
Thread t = new Thread(ts); 
t.Start(); 
+0

Ich habe versucht, das herauszufinden und das scheint zu funktionieren. Gibt es eine Erklärung dafür, wie das Umwickeln eines Dispatcher-Aufrufs in einem Thread es glücklich macht? – StrikeForceZero

+0

Einige Klassen verwenden Threads, die nicht im Hintergrund ausgeführt werden. Und Herunterfahren beendet normalerweise nur Hintergrundthreads automatisch. Sie sollten also versuchen, alle Variablen zu entfernen, die eine Klasse verwenden, die Threading vor dem Beenden verwendet. – Zunair

10

Meiner Erfahrung nach müssen alle Threads entweder explizit beendet werden oder als Hintergrund-Threads gekennzeichnet sein, damit die Anwendung geschlossen wird. Hier

ist ein Beispiel des Tretens ein roter Faden im Hintergrund aus:

_readThread = new Thread(new ThreadStart(ReadThread)); 
_readThread.Name = "Receiver"; 
_readThread.Priority = ThreadPriority.Highest; 
_readThread.IsBackground = true; 
_readThread.Start(); 

Die IsBackground Eigenschaft ist der Schlüssel. Ohne dass dies festgelegt ist, wird der Thread beim Beenden von Shutdown nicht beendet.

+0

Die App wird normalerweise auf andere Weise geschlossen. – Thomas

+0

Vielen Dank für diesen Kommentar, es hat mir einige große Kopfschmerzen erspart, die herausfinden wollten, warum meine Anwendung nicht vollständig beendet wurde. –

1

erlebe ich nur Application.Current.Shutdown nicht funktioniert, wenn ich m läuft von Visual Studio. In Visual Studio (zumindest die 2010 Version, die ich verwende) Application.Current.Shutdown macht nichts. Wenn ich Schritt für Schritt durchführe, führe diese Zeile aus und fahre dann fort. Wenn ich das Programm (als .exe) aus Windows Explorer ausführen, funktioniert Application.Current.Shutdown einwandfrei.

Es gibt wahrscheinlich eine Erklärung dafür, da während des Debuggens andere Threads aktiv sind, aber ich kann es nicht erklären.

+0

Ja, das gleiche hier, aber es ist wirklich mit meinem Debugging verwechselt. – ProfK