Comment quitter correctement une application C#?

j'ai publié une application en C#. Le problème ici est que chaque fois que je ferme le formulaire principal en cliquant sur le bouton rouge de sortie, il ferme le formulaire mais il ne ferme pas l'application. J'ai découvert cela quand j'ai essayé d'éteindre l'ordinateur, en espérant que l'application que j'ai fait fonctionnait bien puis j'ai été bombardé par beaucoup de fenêtres d'enfant avec lequel j'ai mis MessageBox alertes.

j'ai essayé L'Application.De sortie, mais il appelle encore toutes les fenêtres d'enfant et alertes et je ne sais pas comment utiliser environnement.Exit et quel entier mettre dedans. Par ailleurs, chaque fois que mes formulaires appellent le formclosed ou l'événement de fermeture du formulaire je ferme la demande avec une fonction this.Hide() . Cela a-t-il une incidence sur le comportement actuel de ma demande?

139
demandé sur Tshepang 2012-10-19 19:50:10

8 réponses

de MSDN:

de l'Application.Sortie

informe toutes les pompes de message qu'elles doivent se terminer, puis ferme toutes les fenêtres d'application après que les messages ont été traités. C'est le code à utiliser si vous avez d'Application.Exécuter (WinForms applications), cette méthode arrête toutes les boucles de message courant sur tous les threads et ferme toutes les fenêtres de l'application.

environnement.Sortie

termine ce processus et donne au système d'exploitation sous-jacent le code de sortie spécifié. C'est le code à appeler lorsque vous utilisez l'application console.

le Présent article, de l'Application.Sortie vs de l'Environnement.Sortie , pointe vers une bonne astuce:

vous pouvez déterminer si System.Windows.Forms.Application.Run a été appelé en cochant la propriété System.Windows.Forms.Application.MessageLoop . Si true, alors Run a été appelé et vous pouvez supposer qu'une application WinForms est exécutée comme suit.

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

référence: pourquoi appliquer.La sortie ne fonctionne pas?

250
répondu Furqan Safdar 2017-05-23 12:34:41

je sais que ce n'est pas le problème que vous aviez, mais une autre raison pour laquelle cela pourrait arriver est que vous avez un thread non background ouvert dans votre application.

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

quand IsBackground est false il gardera votre programme ouvert jusqu'à la fin du thread, si vous mettez IsBackground à true le thread ne gardera pas le programme ouvert. Des choses comme BackgroundWoker , ThreadPool , et Task tous l'utilisation interne d'un fil avec IsBackground mis à true .

13
répondu Scott Chamberlain 2013-10-08 21:18:18

Tout ce dont vous avez besoin est System.Environment.Exit(1);

et il utilise l'espace de noms de système" en utilisant le système " qui est à peu près toujours là quand vous commencez un projet.

10
répondu Omar Moodie 2014-07-29 18:30:20

soit dit en passant. chaque fois que mes formulaires appellent le formclosed ou le form closing event je ferme l'application avec un Ceci.Hide() fonction. Cela a-t-il une incidence sur le comportement actuel de ma demande?

en résumé, Oui. La demande complète se terminera lorsque le formulaire principal (le formulaire commencé par Application.Run dans la méthode Main ) est fermé (et non caché).

si votre application entière devrait toujours se terminer complètement chaque fois que votre formulaire principal est fermé, vous devez simplement supprimer cette forme fermée gestionnaire. Par pas l'annulation de l'événement et de les laisser près lorsque l'utilisateur ferme, vous obtiendrez votre comportement souhaité. Comme pour toutes les autres formes, si vous n'avez pas l'intention de montrer la même instance de la forme à nouveau, vous les laissez simplement fermer, plutôt que d'empêcher la fermeture et de les cacher. Si vous les montrez à nouveau, alors les cacher peut être très bien.

Si vous voulez être en mesure d'avoir l'utilisateur clique sur le " x "pour votre formulaire principal, mais avoir un autre formulaire rester ouvert et, en fait, devenir le" nouveau " formulaire principal, puis il est un peu plus compliqué. Dans un tel cas, vous aurez besoin de simplement cacher votre formulaire principal plutôt que de le fermer, mais vous aurez besoin d'ajouter une sorte de mécanisme qui sera réellement fermer le formulaire principal lorsque vous voulez vraiment que votre application se termine. Si c'est la situation dans laquelle vous êtes, vous devrez ajouter plus de détails à votre question décrivant quels types de demandes devraient et ne devraient pas réellement mettre fin au programme?

7
répondu Servy 2012-10-19 16:51:12

Faites-vous:

Application.Run(myForm);

dans votre Main()?

j'ai trouvé un moyen très facile de tuer la demande lorsque le formulaire est fermé.

2
répondu LightStriker 2012-10-19 15:52:00

je voudrais soit l'une des opérations suivantes:

de l'Application.Exit ();

pour un winform ou

Environment.Exit (0);

pour une application sur console (fonctionne aussi sur winforms).

Merci!

1
répondu Techcraft7 2018-04-20 16:07:34
Environment.Exit(exitCode); //exit code 0 is a proper exit and 1 is an error
-1
répondu joe pelletier 2016-04-16 19:56:51

dans ce cas, la façon la plus appropriée de quitter l'application pour outrepasser la méthode onExit() dans App.XAML.cs:

protected override void OnExit(ExitEventArgs e) {
    base.OnExit(e); 
}
-2
répondu Anton Tsches 2018-05-07 15:13:23