it-swarm.com.de

Wie kann ich eine C # -Anwendung ordnungsgemäß beenden?

Ich habe eine veröffentlichte Anwendung in C #. Das Problem ist, wenn ich das Hauptformular schließe, indem ich auf die rote Schaltfläche "Beenden" klicke, das Formular schließt, die Anwendung jedoch nicht geschlossen wird. Ich fand dies heraus, als ich versuchte, den Computer herunterzufahren, in der Hoffnung, dass die von mir erstellte Anwendung reibungslos lief, und wurde dann von vielen untergeordneten Fenstern bombardiert, mit denen ich MessageBox Alerts gesetzt habe.

Ich habe Application.Exit ausprobiert, aber es werden immer noch alle untergeordneten Fenster und Warnungen aufgerufen, und ich weiß nicht, wie Environment.Exit und welche Ganzzahl verwendet werden soll. Übrigens, wenn meine Formulare das Ereignis formclosed oder form closing aufrufen, schließe ich die Anwendung mit einer Funktion this.Hide(). Hat das Einfluss darauf, wie sich meine Anwendung jetzt verhält?

168

Von MSDN:

Application.Exit

Informiert alle Nachrichtenpumpen darüber, dass sie beendet werden 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 ausgeführten Nachrichtenschleifen in allen Threads und schließt alle Fenster der Anwendung.

Environment.Exit

Beendet diesen Prozess und gibt dem zugrunde liegenden Betriebssystem den angegebenen Beendigungscode. Dies ist der Code, den Sie aufrufen müssen, wenn Sie eine 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 Eigenschaft System.Windows.Forms.Application.MessageLoop überprüfen. Wenn true, 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 würde Application.Exit nicht funktionieren?

289
Furqan Safdar

Ich weiß, dass dies nicht das Problem ist, das Sie hatten. Ein weiterer Grund dafür ist, dass in Ihrer Anwendung kein Hintergrund-Thread geöffnet ist.

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 IsBackgroundfalse ist, bleibt Ihr Programm geöffnet, bis der Thread abgeschlossen ist. Wenn Sie IsBackground auf true setzen, hält der Thread das Programm nicht geöffnet. Dinge wie BackgroundWoker, ThreadPool und Task verwenden alle intern einen Thread, bei dem IsBackground auf true gesetzt ist.

15

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

Dabei wird der System-Namespace "using System" verwendet, der praktisch immer vorhanden ist, wenn Sie ein Projekt starten.

13
Omar Moodie

Apropos. Wenn meine Formulare das Ereignis formclosed oder form closing aufrufen, schließe ich die Anwendung mit der Funktion this.Hide (). Hat das Einfluss darauf, wie sich meine Anwendung jetzt verhält?

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 soll, wenn Ihr Hauptformular geschlossen wird, sollten Sie nur diesen Formular-Closed-Handler entfernen. Wenn Sie dieses Ereignis nicht absagen und es nur schließen lassen, wenn der Benutzer es schließt, erhalten Sie das gewünschte Verhalten. Wie bei allen anderen Formularen, wenn Sie nicht beabsichtigen, dieselbe Instanz des Formulars erneut anzuzeigen, lassen Sie sie einfach schließen, anstatt zu verhindern, dass sie geschlossen und ausgeblendet werden. Wenn Sie sie erneut anzeigen, ist es möglicherweise in Ordnung, sie auszublenden.

Wenn Sie möchten, dass der Benutzer auf das "x" für Ihr Hauptformular klickt, aber ein anderes Formular geöffnet bleibt und quasi das "neue" Hauptformular wird, ist dies etwas komplizierter. In einem solchen Fall müssen Sie Ihr Hauptformular nur ausblenden, anstatt es zu schließen, aber Sie müssen eine Art Mechanismus hinzufügen, der tatsächlich das Hauptformular schließt, wenn Sie es wirklich wollen App zum Beenden. In dieser Situation müssen Sie Ihrer Frage weitere Details hinzufügen, die beschreiben, welche Arten von Anwendungen das Programm tatsächlich beenden sollen und welche nicht.

7
Servy

Ich würde entweder eine der folgenden:

Application.Exit ();

für eine Winform oder

Environment.Exit (0);

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

Vielen Dank!

4
Techcraft7

Machst du:

Application.Run(myForm);

in deinem Main ()?

Ich fand es sehr einfach, die Anwendung zu beenden, wenn das Formular geschlossen ist.

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