Wie man eine C # Anwendung richtig beendet?

Ich habe eine veröffentlichte Anwendung in C #. Das Problem hier ist, wenn ich das Hauptformular schließe, indem ich auf den roten Ausgangsknopf klicke, schließt es das Formular, aber es schließt die Anwendung nicht. Ich fand das heraus, als ich versuchte, den Computer herunterzufahren, hoffnungsvoll, dass die Anwendung, die ich gemacht habe, reibungslos funktionierte, und dann wurde ich von vielen Kinderfenstern bombardiert, mit denen ich MessageBox Alerts gesetzt habe.

Ich habe versucht, Application.Exit, aber es ruft immer noch alle untergeordneten Fenster und Warnungen und ich weiß nicht, wie Environment.Exit und welche Integer zu verwenden. By the way, wenn meine Formulare das formclosed oder form closing-Ereignis aufrufen, schließe ich die Anwendung mit einer this.Hide() function. Beeinflusst das meine Anwendung jetzt?

Solutions Collecting From Web of "Wie man eine C # Anwendung richtig beendet?"

Von MSDN:

Anwendung.Exit

Informiert alle Nachrichtenpumpen, die sie beenden müssen, und schließt dann alle Anwendungsfenster, nachdem die Nachrichten verarbeitet wurden. Dies ist der zu verwendende Code, wenn Sie Application.Run (WinForms-Anwendungen) aufgerufen haben. Diese Methode stoppt alle laufenden Nachrichtenschleifen für alle Threads und schließt alle Fenster der Anwendung.

Umgebung.Exit

Beendet diesen process und gibt dem zugrunde liegenden Betriebssystem den angegebenen Beendigungscode. Dies ist der Code, der aufgerufen wird, wenn Sie die Konsolenanwendung verwenden.

Dieser Artikel, Application.Exit vs. Environment.Exit , weist auf einen guten Tipp hin:

Sie können feststellen, ob System.Windows.Forms.Application.Run aufgerufen wurde, indem Sie die System.Windows.Forms.Application.MessageLoop Eigenschaft überprüfen. Wenn dies der Fall ist, wurde Run aufgerufen, und Sie können davon ausgehen, dass eine WinForms-Anwendung wie folgt ausgeführt wird.

 if (System.Windows.Forms.Application.MessageLoop) { // WinForms app System.Windows.Forms.Application.Exit(); } else { // Console app System.Environment.Exit(1); } 

Referenz: Warum funktioniert Application.Exit nicht?

Ich weiß, dass dies nicht das Problem ist, das Sie hatten, aber ein anderer Grund, warum dies passieren könnte, ist, dass Sie einen Nicht-Hintergrund-Thread in Ihrer Anwendung geöffnet haben.

 using System; using System.Threading; using System.Windows.Forms; namespace Sandbox_Form { static class Program { private static Thread thread; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); thread = new Thread(BusyWorkThread); thread.IsBackground = false; thread.Start(); Application.Run(new Form()); } public static void BusyWorkThread() { while (true) { Thread.Sleep(1000); } } } } 

Wenn IsBackground false , wird Ihr Programm geöffnet bleiben, bis der Thread fertig ist. Wenn Sie IsBackground auf true der Thread das Programm nicht geöffnet lassen. Dinge wie BackgroundWoker , ThreadPool und Task alle intern einen Thread, bei dem IsBackground auf true .

Alles, was Sie brauchen, ist System.Environment.Exit(1);

Und es verwendet den System-Namespace “using System”, der so ziemlich immer vorhanden ist, wenn Sie ein Projekt starten.

Apropos. Immer wenn meine Formulare das formclosed- oder form closing-Ereignis aufrufen, schließe ich die Anwendung mit einer this.Hide () – function. Beeinflusst das meine Anwendung jetzt?

Kurz gesagt, ja. Die gesamte Anwendung wird beendet, wenn das Hauptformular (das über Application.Run in der Main Methode gestartete Formular) geschlossen (nicht ausgeblendet) wird.

Wenn Ihre gesamte Anwendung immer vollständig beendet werden sollte, wenn Ihr Hauptformular geschlossen wird, sollten Sie nur diese geschlossene Formularhandler entfernen. Indem Sie dieses Ereignis nicht abbrechen und es sich nur schließen lassen, wenn der Benutzer es schließt, erhalten Sie Ihr gewünschtes Verhalten. Wie bei allen anderen Formularen, wenn Sie nicht beabsichtigen, dieselbe Instanz des Formulars erneut anzuzeigen, lassen Sie sie einfach schließen, anstatt die Schließung zu verhindern und sie zu verbergen. Wenn du sie wieder zeigst, kann es gut sein, sie zu verstecken.

Wenn Sie möchten, dass der Benutzer auf das “x” für Ihr Hauptformular klickt, aber ein anderes Formular offen bleibt und quasi zum “neuen” Hauptformular wird, dann ist es etwas komplizierter. In einem solchen Fall müssen Sie Ihr Hauptformular ausblenden, anstatt es zu schließen, aber Sie müssen eine Art Mechanismus hinzufügen, der das Hauptformular schließt, wenn Sie wirklich möchten, dass Ihre App beendet wird. Wenn dies die Situation ist, in der Sie sich befinden, müssen Sie Ihrer Frage weitere Details hinzufügen, die beschreiben, welche Arten von Anwendungen das Programm tatsächlich beenden sollten und nicht.

Machst du:

 Application.Run(myForm); 

in deinem Main ()?

Ich fand es eine sehr einfache Möglichkeit, die Anwendung zu beenden, wenn das Formular geschlossen ist.

Ich würde entweder eines der folgenden:

Application.Exit ();

für eine Winform oder

Umgebung.Ausgang (0);

für eine Konsolenanwendung (funktioniert auch auf Winforms).

Vielen Dank!

 Environment.Exit(exitCode); //exit code 0 is a proper exit and 1 is an error 

In diesem Fall ist es die beste Methode, die Anwendung zu beenden, um die onExit () -Methode in App.xaml.cs zu überschreiben:

 protected override void OnExit(ExitEventArgs e) { base.OnExit(e); }