web-dev-qa-db-fra.com

Comment quitter tous les threads en cours d'exécution?

Le code suivant ne quitte pas l'application. Comment puis-je quitter l'application et m'assurer que tous les threads en cours d'exécution sont fermés?

foreach (Form form in Application.OpenForms)
{
    form.Close();
}
Application.Exit();
57
monkey_boys

Vous ne montrez pas l'utilisation de threads dans votre code, mais supposons que vous en ayez. Pour fermer tous vos threads, vous devez tous les définir sur des threads d'arrière-plan avant de les démarrer, puis ils seront fermés automatiquement à la fermeture de l'application, par exemple:

Thread myThread = new Thread(...);
myThread.IsBackground = true; // <-- Set your thread to background
myThread.Start(...);

Un article "HOWTO: arrêter plusieurs threads" de Microsoft: http://msdn.Microsoft.com/en-us/library/aa457093.aspx

86
Kiril

Vous pouvez essayer le code suivant:

Environment.Exit(Environment.ExitCode);
52
Amerzilla

J'ai rencontré un problème similaire dans mon logiciel, mais malheureusement, le simple fait de faire fonctionner les threads en arrière-plan n'a pas résolu le problème. En fait, alors que le thread ramène des données (le logiciel principal est piloté par les données) et si je ferme l'application, il en résulte une erreur Windows, donnant lieu à un message de débogage.

Donc, ce qui a réellement fonctionné pour moi:

Étape 1: Faire fonctionner tous les threads en arrière-plan, tels que

Thread aThread = new Thread(MethodName);
aThread.IsBackground = true; //<-- Set the thread to work in background
aThread.Start();

Étape 2: Dans l'action de fermeture du formulaire/application, appelez la méthode Environment.Exit, telle que

Environment.Exit(Environment.ExitCode);

Cela a gardé la mémoire parfaitement gérée, sans fuite de mémoire.

J'espère que cela t'aides.

23
Somdip Dey

Cela devrait fonctionner pour tous les threads que vous avez ouverts.

protected override void OnExiting(Object sender, EventArgs args)
{
    base.OnExiting(sender, args);
    Environment.Exit(Environment.ExitCode);
}
13
Beesman

Cela a fait le travail pour moi:

À la place d'utiliser:

Application.Exit() 

ce qui laisse les autres threads ouverts, essayez d'utiliser:

Environment.Exit(Environment.ExitCode);
4
JimmyOnTheCode

C'est le meilleur moyen de vous assurer que votre application se ferme (avec force):

(Process.GetCurrentProcess()).Kill()

Le problème avec Environment.Exit est qu'il ne fonctionne que s'il se trouve sur le thread principal. De plus, il bloque parfois les threads.

La raison principale pour laquelle votre programme ne se ferme pas correctement est que le formulaire n'est pas en mesure de se disposer (et donc tous les objets qu'il a créés). Il est beaucoup plus difficile de résoudre ce problème. Je recommanderais d'exécuter le code ci-dessus après avoir attendu un certain temps pour que tous les gestionnaires d'élimination possibles soient appelés en premier.

3
Jake Hiegel