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?
8 réponses
de MSDN:
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.
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);
}
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
.
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.
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?
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é.
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!
Environment.Exit(exitCode); //exit code 0 is a proper exit and 1 is an error
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);
}