2009-06-29 15 views
20

J'utilise VSTS 2008 + .Net 3.5 + C# pour développer l'application Windows Forms. Ma confusion est, semble Application.Exit ne force pas l'application à se terminer? Si non, quelle méthode dois-je appeler pour que l'application se termine?Application.Exit

EDIT 1:

Normalement, la principale méthode est comme ça, comment quitter la fonction principale gracieusement sans appeler Environment.Exit?

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

merci à l'avance, George

+2

Re votre modifier - dans votre formulaire, appelez simplement Close(); –

+0

Marc, j'ai lu votre réponse, mais où appeler Close? Dans Main ou remplacez le code pour appeler Application.Exit avec le code pour appeler Fermer? – George2

+0

Quel est le problème avec 'Environment.Exit (Environment.ExitCode)'? – stackptr

Répondre

32

Application.Exit demande vraiment juste très doucement la boucle de message.

Si vous voulez que votre application se termine, le meilleur moyen est de la faire gracieusement sortir de Main, et de fermer proprement les threads non-background supplémentaires. Si vous voulez être brutal ... Environment.Exit ou Environment.FailFast? note c'est dur - à peu près la même chose que de tuer le vôtre Process.

+9

+1 pour une grande personnification – colithium

+0

Merci Marc, je suis confus comment quitter la fonction Main gracieusement. J'ai posté mon code dans mon article original sous la section EDIT 1. Des idées pourquoi? – George2

+0

Marc, j'ai lu votre réponse, mais où appeler Close? Dans Main ou remplacez le code pour appeler Application.Exit avec le code pour appeler Fermer? – George2

4

Si votre application ne quitte pas normalement lorsque vous appelez Application.Exit il y a (évidemment) quelque chose qui l'empêche de le faire. Cela peut être quelque chose d'un paramètre de formulaire e.Cancel = true dans l'événement FormClosing, à un thread qui n'est pas un thread d'arrière-plan qui est toujours en cours d'exécution. Je vous conseille de faire des recherches minutieuses sur ce qui maintient votre processus en vie et de le refermer d'une manière agréable. Cela devrait également rendre votre demande bien plus agréable.

Typiquement, dans une application winforms, il devrait suffire de fermer la forme principale.

+0

Vous voulez dire que si tous les threads que j'ai créés explicitement sont marqués en tant qu'arrière-plan, l'application devrait se fermer après avoir appelé Application.Exit? – George2

+1

@ George2: au moins, ils ne garderont pas l'application en vie en étant des threads de premier plan; il peut y avoir d'autres raisons pour lesquelles il ne sort pas, mais c'est un endroit à vérifier. Je pense cependant que la valeur par défaut de Thread.IsBackground est false. Ça vaut le coup de vérifier. –

+0

Merci @Fredrik, quand j'appelle Application.Exit, il y a des threads non backgroud en cours d'exécution (ils sont créés par moi-même explicitement en utilisant new Thread(). Start()), pensez-vous que c'est la raison des threads explicitement créés qui bloque mon application de quitter (quand appelez Application.Exit())? – George2

2

-je utiliser

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); 
} 

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

+0

Merci Peter, 1. Je suis curieux de savoir ce que fait réellement Application.Exit: il suffit d'arrêter la pompe du message et de ne plus avoir de fonction (comme terminer l'application)? 2. Si Application.Exit n'a pas de fonction pour terminer l'application Windows Forms, pourquoi, si nous définissons la propriété d'un autre thread sur des threads backgourd, après avoir appelé Application.Exit, l'application sera terminée? – George2

+0

Salut George2, à partir de MSDN: 1. Application.Exit Informe toutes les pompes de message qu'ils doivent terminer, puis * ferme toutes les fenêtres d'application * après le traitement des messages. 2. il a la fonction pour terminer/fermer –

1

J'ai eu le même problème quand j'ai découvert l'ouverture d'une nouvelle forme/fenêtre à l'intérieur du programme, et seulement CACHER cette seconde forme (non fermer), serait empêcher le formulaire principal de quitter correctement via Application.Exit();

Il existe deux solutions dans ce cas. La première consiste simplement à utiliser Close() sur le formulaire principal au lieu de Application.Exit(). Deuxième solution est d'utiliser le code suivant:

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

mainForm.Close() fonctionne pour moi. J'avais une fenêtre cachée qui causait ce problème. Quelle est la différence entre Close() et Application.Exit()? –

15

les opérations suivantes:

Process.GetCurrentProcess().Kill(); 

Environment.Exit ne fonctionne pas avec Winforms et Environment.FailFast jette sa propre exception.

-1

Je trouve que tout simplement tout ce que vous devez faire est de faire insted application.exit et tout ce que vous avez juste à faire est de mettre en fin assez simplement la commande End ferme il

+0

Cela ne répond pas vraiment à la question. Entre autres choses, vous ne dites pas ce que signifie «End». Parlez-vous de VB.NET? La question concerne C#. –

+0

Ahh désolé, alors je ne sais pas – Leon