2009-06-29 2 views
20

Ich verwende VSTS 2008 +. NET 3.5 + C#, um Windows Forms-Anwendung zu entwickeln. Meine Verwirrung ist, scheint Application.Exit die Anwendung nicht zum Beenden gezwungen? Wenn nicht, welche Methode sollte ich aufrufen, um die Anwendung zu beenden?Application.Exit

EDIT 1:

Normalerweise ist die wichtigste Methode, wie das ist, wie Hauptfunktion ordnungsgemäß zu beenden, ohne Environment.Exit Aufruf? sehr sanft

static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     try 
     { 
      Application.Run(new Form1()); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine (ex.Message); 
     } 
    } 

Vielen Dank im Voraus, George

+2

Re deine Bearbeitung schließt - in Ihrem Form, rufen Sie einfach Close(); –

+0

Marc, ich habe deine Antwort gelesen, aber wo kann ich Close anrufen? Innerhalb von Main oder ersetzen Sie den Code, um Application.Exit mit Code aufzurufen, um Close aufzurufen? – George2

+0

Was ist falsch mit 'Environment.Exit (Environment.ExitCode)'? – stackptr

Antwort

32

Application.Exit wirklich fragt nur die Nachrichtenschleife.

Wenn Sie möchten, dass Ihre Anwendung beendet wird, ist es am besten, wenn Sie sie ordnungsgemäß aus Main erstellen und alle zusätzlichen nicht Hintergrundthreads sauber schließen.

Wenn Sie brutal sein wollen ... Environment.Exit oder Environment.FailFast? Hinweis das ist hart - etwa das gleiche wie das Töten Ihrer eigenen Process.

+9

+1 für große Personifikation – colithium

+0

Dank Marc, ich bin verwirrt, wie die Hauptfunktion anmutig zu beenden. Ich habe meinen Code in meinem ursprünglichen Beitrag unter EDIT 1-Abschnitt veröffentlicht. Irgendwelche Ideen warum? – George2

+0

Marc, ich habe deine Antwort gelesen, aber wo soll ich Close anrufen? Innerhalb von Main oder ersetzen Sie den Code, um Application.Exit mit Code aufzurufen, um Close aufzurufen? – George2

4

Wenn Ihre Anwendung nicht ordnungsgemäß nicht verlassen, wenn Sie anrufen Application.Exit gibt es (natürlich) etwas, das so es zu tun, verhindert. Das kann alles von einer Formulareinstellung e.Cancel = true in dem Ereignis FormClosing zu einem Thread sein, der kein Hintergrundthread ist, der noch ausgeführt wird. Ich würde dir raten, sorgfältig zu untersuchen, was genau deinen Prozess am Leben erhält und das auf eine nette Art und Weise schließt. Das sollte deine Bewerbung auch gut machen.

In einer Winforms-Anwendung sollte es normalerweise ausreichend sein, das Hauptformular zu schließen.

+0

Sie meinen, wenn alle Threads, die ich erstellt habe, explizit als Hintergrund markiert sind, sollte die Anwendung nach dem Aufruf von Application.Exit beendet werden? – George2

+1

@ George2: Zumindest werden sie nicht die Anwendung am Leben erhalten, indem sie im Vordergrund Threads; es kann andere Gründe geben, warum es nicht austritt, aber das ist ein Ort, den man überprüfen sollte. Ich denke jedoch, dass der Standardwert für Thread.IsBackground falsch ist. Aber es lohnt sich zu überprüfen. –

+0

Dank @Fredrik, wenn ich Application.Exit aufrufen, gibt es einige non-backgroud Threads ausgeführt (sie werden von mir explizit mit neuen Thread() erstellt.) Start()), glauben Sie, es ist der Grund der explizit erstellten Threads was verhindert, dass meine Anwendung beendet wird (wenn Application.Exit() aufgerufen wird)? – George2

2

Ich benutze

if (System.Windows.Forms.Application.MessageLoop) 
{ 
    // Use this since we are a WinForms app 
    System.Windows.Forms.Application.Exit(); 
} 
else 
{ 
    // Use this since we are a console app 
    System.Environment.Exit(1); 
} 

von http://geekswithblogs.net/mtreadwell/archive/2004/06/06/6123.aspx

+0

Danke Peter, 1. Ich bin interessiert zu erfahren, was Application.Exit wirklich macht - nur die Meldung Pumpe stoppt und keine Funktion mehr (wie Anwendung beenden)? 2. Wenn Application.Exit keine Funktion zum Beenden der Windows Forms-Anwendung hat, warum, wenn wir die Eigenschaft eines anderen Threads auf Backgourd-Threads setzen, wird nach dem Aufruf von Application.Exit die Anwendung beendet? – George2

+0

Hallo George2, von MSDN: 1. Application.Exit Informiert alle Nachrichtenpumpen, die sie beenden müssen, und dann * schließt alle Anwendungsfenster *, nachdem die Nachrichten verarbeitet wurden. 2. Es hat die Funktion zu beenden/zu schließen –

1

Ich hatte das gleiche Problem, wenn ich innerhalb des Programms ein neues Formular/Fenster entdeckt zu öffnen und nur HIDING, dass die zweite Form (Schluss es nicht), würde verhindern, dass das Hauptformular über Application.Exit() ordnungsgemäß beendet wird;

In diesem Fall gibt es zwei Lösungen. Zuerst verwenden Sie einfach Close() auf dem Hauptformular anstelle von Application.Exit(). Zweite Lösung ist den folgenden Code zu verwenden:

if (secondForm != null && !secondForm.IsDisposed) secondForm.Dispose(); 
+0

mainForm.Close() funktioniert für mich. Ich hatte ein verstecktes Fenster, das dieses Problem verursachte. Was ist der Unterschied zwischen Close() und Application.Exit()? –

15

Versuchen Sie Folgendes:

Process.GetCurrentProcess().Kill(); 

Environment.Exit funktioniert nicht mit WinForms und Environment.FailFast wirft seine eigene Ausnahme.

-1

fand ich, dass einfach alles, was Sie tun müssen, ist insted Application.Exit und alle tun, die Sie gerade in Ende gesetzt tun müssen, ist einfach genug, um den End-Befehl es

+0

Dies beantwortet nicht wirklich die Frage. Unter anderem sagen Sie nicht, was "Ende" bedeutet. Beziehen Sie sich auf VB.NET? Die Frage betrifft C#. –

+0

Ahh Entschuldigung Mann dann weiß ich nicht – Leon

Verwandte Themen