Entwickler-Ecke

WinForms - Forms-Application schließt nicht


C# - So 09.10.11 20:48
Titel: Forms-Application schließt nicht
Hallo,

vorweg: ich hätte einen passenderen Titel gewählt, aber der ist zu lang xD.

Also ich hab eine Forms-Application erstellt. Diese läuft auch wunderbar. Doch wenn ich Application.Exit() aufrufe, schließen sich alle Fenster, doch die Anwendung ist weiterhin aktiv. Ich habe keine MainForm sondern einen ApplicationContext, der die anderen Forms steuern soll.
Das ist der Code des ApplicationContexts:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
class _Forms : ApplicationContext
    {
        public static string CurrentUser { get; set; }
        public static string CurrentPw { get; set; }

        public _Forms()
        {

            //Now the loop starts which control the Froms
            while (true)
            {
                LogIn loginForm = new LogIn();
                MainForm mainForm = new MainForm();
                DialogResult res = loginForm.ShowDialog();
                if (res != DialogResult.OK) break;
                mainForm.user = CurrentUser;
                mainForm.password = CurrentPw;
                res = mainForm.ShowDialog();
                if (res == DialogResult.Retry) continue;
                if (res == DialogResult.Cancel) break;
            }
            Application.Exit(); //hier sollte eigentlich schluss sein
        }

    }


//Edit:
Ich hab ne Lösung gefunden. Sry für den unnötigen Post. Wen es interresiert: Environment.Exit(Environment.ExitCode)


storestore - So 09.10.11 22:36

Ein einfache Close(); genügt ohne Applikation oder So.
MfG storestore


C# - Mo 10.10.11 19:41

eben nicht. Erstell mal ein Projekt mit einem "ApplicationContext" als Hauptform. Und dann probier mal die mit Close() zu schließen. Dann siehst du was ich mein.


ujr - Di 11.10.11 09:14

Hallo,

user profile iconC# hat folgendes geschrieben Zum zitierten Posting springen:

C#-Quelltext
1:
Environment.Exit(Environment.ExitCode)                    


ist die ganz harte Variante.

Das Problem in Deinem Fall ist, dass Du Application.Exit aus dem Konstruktor aufrufst. Wie sich überhaupt alles im Konstruktor abspielt.

Application.Exit beendet die Nachrichtenverarbeitung - allerdings läuft die im Konstruktor noch gar nicht, sodass der Aufruf wirkungslos bleibt. Nach dem Konstruktor wird die Nachrichtenschleife aber gestartet, sodass Dein Programm sich nicht mehr beendet.

Irgendwie finde ich das Design der Anwendung mit den Fenstern im Konstruktor nicht ganz optimal. Dass es Probleme gibt siehst Du ja hier. Vielleicht sollte man besser mit Show und den FormClosed-Ereignissen arbeiten. Eine Lösung mit der bisherigen Variante wäre der Einsatz eines System.Windows.Forms.Timer's statt Application.Exit, der dann im Tick-Ereignis Application.Exit aufruft.


Th69 - Di 11.10.11 10:58

Hallo C#,

dein Programmdesign ist außerst konfus. Du hast anscheinend die ApplicationContext-Klasse überhaupt nicht verstanden (trotz des gut gemeinten Ratschlags von Ralf Jansen in dem anderen Beitrag von dir Form2.Show() funktioniert nicht [http://www.c-sharp-forum.de/viewtopic.php?t=107299] solltest du besser bei der einfachen Standardvariante bleiben).
Bisher 'funktioniert' dein Code auch nur wegen den ShowDialog()-Aufrufen, da diese eine eigene MessageLoop verwenden (d.h. es ist völlig egal, ob du eine ApplicationContext oder sonst eine andere Klasse verwendest).

Eine andere Alternative wäre der Aufruf der

C#-Quelltext
1:
Application.Run();                    

(d.h. ohne Angabe eines Formulars).
Dann müßtest du nur Application.Exit() an der richtigen Stelle aufrufen (d.h. beim Close() des Hauptformulars).

Jedoch empfehle ich dir dringend (bei deinen jetzigen Kenntnissen) es so zu machen, wie ich es in dem anderen Beitrag vorgeschlagen habe.