web-dev-qa-db-fra.com

Comment quitter correctement une application C #?

J'ai une application publiée 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 ne ferme pas l'application. Je l’ai découvert lorsque j’ai essayé d’éteindre l’ordinateur, espérant que mon application fonctionnait sans à-coups, puis j’ai été bombardé par de nombreuses fenêtres enfants avec lesquelles j’ai mis MessageBox Alerts.

J'ai essayé Application.Exit mais il appelle toujours toutes les fenêtres enfants et les alertes et je ne sais pas comment utiliser Environment.Exit et quel entier y mettre. En passant, chaque fois que mes formulaires appellent l'événement formclosed ou form fermeture, je ferme l'application avec une fonction this.Hide(). Cela at-il une incidence sur le comportement actuel de ma demande?

168

De MSDN:

Application.Exit

Informe tous les distributeurs de messages qu'ils doivent se terminer, puis ferme toutes les fenêtres d'application après le traitement des messages. C'est le code à utiliser si vous avez appelé Application.Run (applications WinForms), cette méthode arrête toutes les boucles de messages en cours d'exécution sur tous les threads et ferme toutes les fenêtres de l'application.

Environment.Exit

Met fin à 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 une application console.

Cet article, Application.Exit contre Environment.Exit , indique un bon conseil:

Vous pouvez déterminer si System.Windows.Forms.Application.Run a été appelé en vérifiant la propriété System.Windows.Forms.Application.MessageLoop. Si la valeur est true, Run a été appelé et vous pouvez supposer qu'une application WinForms s'exécute 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 Application.Exit ne fonctionnerait-il pas?

289
Furqan Safdar

Je sais que ce n’est pas le problème que vous aviez, mais une autre raison qui pourrait vous arriver est que vous avez un fil de discussion en arrière-plan 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);
            }
        }
    }
}

Lorsque IsBackground vaut false, votre programme restera ouvert jusqu'à la fin du thread. Si vous définissez IsBackground sur true, le thread ne gardera pas le programme ouvert. Des choses comme BackgroundWoker, ThreadPool et Task utilisent toutes en interne un thread avec IsBackground réglé sur true.

15

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

Et il utilise l'espace de noms système "using System" qui est quasiment toujours présent lorsque vous démarrez un projet.

13
Omar Moodie

Au fait. chaque fois que mes formulaires appellent l'événement formclosed ou form fermeture, je ferme l'application avec une fonction this.Hide (). Cela at-il une incidence sur le comportement actuel de ma demande?

En bref, oui. La totalité de l'application se termine lorsque le formulaire principal (le formulaire démarré via Application.Run dans la méthode Main) est fermé (non masqué).

Si votre application entière doit toujours se terminer complètement à la fermeture de votre formulaire principal, vous devez simplement supprimer ce gestionnaire de formulaire fermé. En n'annulant pas cet événement et en le laissant simplement fermer lorsque l'utilisateur le ferme, vous obtiendrez le comportement souhaité. Comme pour tous les autres formulaires, si vous n'avez pas l'intention de montrer la même instance du formulaire, il vous suffit de les laisser se fermer, plutôt que d'empêcher leur fermeture et de les masquer. Si vous les leur montrez à nouveau, il peut être utile de les cacher.

Si vous voulez que l'utilisateur clique sur le "x" de votre formulaire principal, mais qu'un autre formulaire reste ouvert et devienne en fait le "nouveau" formulaire principal, le processus est un peu plus compliqué. Dans un tel cas, vous devrez simplement masquer votre formulaire principal plutôt que de le fermer, mais vous devrez ajouter une sorte de mécanisme permettant réellement fermez le formulaire principal lorsque vous souhaitez réellement que votre application se termine. Si vous vous trouvez dans cette situation, vous devrez ajouter plus de détails à votre question en précisant quels types d'applications devraient et ne devraient pas réellement terminer le programme.

7
Servy

Je voudrais soit l'un des suivants:

Application.Exit ();

pour un winform ou

Environment.Exit (0);

pour une application console (fonctionne aussi sur winforms).

Merci!

4
Techcraft7

Est ce que tu fais:

Application.Run(myForm);

dans votre main ()?

J'ai trouvé un moyen très facile de tuer l'application lorsque le formulaire est fermé.

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