web-dev-qa-db-fra.com

Pourquoi Application.Exit ne fonctionnerait-il pas?

J'ai une application qui a eu des erreurs étranges lors de l'annulation d'une boîte de dialogue. L'application ne peut pas continuer si la boîte est annulée, elle se ferme, mais elle ne fonctionne pas pour une raison quelconque. Par conséquent, elle continue de fonctionner et se bloque.

J'ai débogué ce problème et, d'une manière ou d'une autre, l'application s'exécute juste après l'appel Application.Exit. J'exécute en mode débogage, ce qui est pertinent en raison d'une petite quantité de code qui dépend de la variable RELEASE en cours de définition. Voici le code de sortie de mon application. J'ai tracé le code et il est entré dans la méthode ExitApp, et continue, rendant le contrôle à l'appelant et finissant par planter.

Il s'agit d'une application qui fournit des rapports sur une connexion de bureau à distance, c'est pourquoi le code de sortie est un peu étrange. Il essaie de mettre fin à la session distante, mais uniquement lors d’une exécution en mode release, car je ne souhaite pas éteindre mon ordinateur dev à chaque exécution de test.

    private void ExitApp()
    {
        HardTerminalExit();
        Application.Exit();
    }

    // When in Debug mode running on a development computer, this will not run to avoid shutting down the dev computer
    // When in release mode the Remote Connection or other computer this is run on will be shut down.
    [Conditional("RELEASE")]
    private void HardTerminalExit()
    {
        WTSLogoffSession(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, false);
    }

J'ai exécuté un débogueur juste après la ligne Application.Exit et rien ne se produit, puis le contrôle est renvoyé à l'appelant une fois que j'ai dépassé cette ligne.

Que se passe-t-il? Ceci est une application Windows Forms.

25
Tony Peterson

Ceci est un article qui développe le même chemin de pensée que vous traversez: http://www.dev102.com/2008/06/24/how-do-you-exit-your-net-application/

Fondamentalement: 

  • Environment.Exit - À partir de MSDN: 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 l'application console .

  • Application.Exit - À partir de MSDN: 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 . Il s’agit du code À utiliser si vous avez appelé Application.Run (applications WinForms ). Cette méthode arrête toutes les Requêtes en cours d’exécution sur tous les threads et ferme toutes les fenêtres de l'application . Il existe quelques autres problèmes concernant À propos de cette méthode. Pour plus d'informations à ce sujet, consultez la page MSDN.

Une autre discussion à ce sujet: http://geekswithblogs.net/mtreadwell/archive/2004/06/06/6123.aspx

Cet article souligne 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)
{
  // 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);
}
43
GEOCHET

Ayant eu ce problème récemment (Application.Exit ne terminait pas correctement les pompes de messages pour win-forms avec Application.Run (new Form ())), j'ai découvert que si vous générez de nouveaux threads ou démarriez des arrière-plans dans le constructeur, cela empêchera Application.Exit de s'exécuter.

Déplacez tous les appels 'RunWorkerAsync' du constructeur vers une méthode de chargement de formulaire:

public Form()
{
  this.Worker.RunWorkerAsync();
}

Déménager à:

public void Form_Load(object sender, EventArgs e)
{
  this.Worker.RunWorkerAsync();
}
7
StigM

Essayez Environment.Exit(exitCode).

6
Nick Gunn

Je suis passé par cette situation dans beaucoup de cas j'utilise Thread.CurrentThread.Abort ()

et le processus est fermé. Il semble qu'Application.Exit ne se connecte pas correctement au thread actuel.

3
Ahmet Murati

Assurez-vous également que la propriété IsBackground est définie sur true pour tous les threads exécutés dans votre application. Les threads n'appartenant pas à l'arrière-plan empêcheront facilement l'application de quitter. 

2
Andrew

Assurez-vous de ne pas avoir Console.ReadLine (); dans votre application et Environment.Exit (1); va travailler et fermer votre application.

2
Mark Bad

Essaye ça : 

dans le fichier Program.cs: 

après Application.Run (nouveau formulaire ());

add Application.Exit ();

0
Ali Gh

Cette application est-elle exécutée (dans la méthode Main) à l'aide de Application.Run()? Sinon, Application.Exit() ne fonctionnera pas.

Si vous avez écrit votre propre méthode Main et que vous souhaitez arrêter l'application, vous ne pouvez vous arrêter qu'en revenant de la méthode Main (ou en tuant le processus).

0
configurator