web-dev-qa-db-fra.com

Tuer tous les threads ouverts par l'application

J'ai un très gros mélange d'applications de c # et j #.

Parfois, lorsque je le ferme, certains threads ne sont pas fermés et ils sont suspendus dans le gestionnaire de tâches et il est impossible de les tuer à partir de là.

J'ai vraiment du mal à trouver toutes ces discussions et à les ajouter à l'événement de clôture.

Y at-il un moyen de tuer violemment tous les threads qui ont été ouverts par l'application dans l'événement de clôture? ...

Merci.

Y at-il peut-être un outil qui peut me dire quels threads sont ouverts pendant que je ferme l’application et qui les a ouverts?

32
Night Walker

Ce ne devrait pas se produire, et si c'est le cas, vous essayez de le corriger.

Lorsque votre application se ferme, le .NET Framework supprimera automatiquement tous les threads dont la propriété IsBackground est définie sur "True". Désignez chacun de vos threads de travail comme threads d’arrière-plan et vous ne rencontrerez plus ce problème. Profiter de la classe BackgroundWorker et de la classe ThreadPool , qui crée automatiquement des threads en arrière-plan, est une bien meilleure option.

Sinon, vous devez nettoyer explicitement vos threads de premier plan. Une application correctement conçue effectuera sa propre comptabilité et utilisera une méthode déterministe et structurée pour s’assurer que tous ses fils ont été fermés avant de quitter la méthode Main. C’est ce que vous devriez faire en tout cas si vos threads nécessitent une résiliation harmonieuse.

Tuer le processus est une très mauvaise idée, tout comme le fait de laisser filer vos discussions comme bon vous semble dans votre application.

47
Cody Gray

Vous pouvez utiliser: Environment.Exit (0); , cela arrêtera l’application si les threads sont en cours d’exécution et ne causera aucun problème.

13
R.Vector

Eh bien, vous pouvez appeler Application.Exit() mais cela ne vous aidera pas beaucoup. La ligne de fond est que vous devez fermer gracieusement tous les threads vous-même si vous voulez faire les choses correctement. 

4
tzup

Vous devriez fermer vos discussions en douceur, mais vous voulez simplement que vous et les autres sachiez de quelle manière ce n'est pas recommandé mais possible:

sur votre gestionnaire OnClose:

System.Diagnostics.Process.GetCurrentProcess().Kill();

Je préfère totalement la manière de faire de Cody Gray.

4
Locke

J'avais un problème similaire lors de la fermeture du formulaire/de l'application. Il ne sortait pas vraiment du mode débogage et passait au mode conception. La suite résout mon problème. 

  1. Suivi le lien. Application Windows Form, le thread ne s'arrête pas
  2. La première étape ne l'a pas résolu. Environment.Exit (0); - Résout et a bien fonctionné. 
0
user10779750
internal void Close()
{
    Dispatcher.CurrentDispatcher.Thread.Abort();
    Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
    Application.Current.Shutdown();
}
0
Mario

Mes 2 cents ... à toutes les réponses ...

Essayez de forcer SHUTDOWN

Mettez dans void CurrentApplication_Exit(object sender, ExitEventArgs e) et private void Window_Closing(object sender, CancelEventArgs e) ces lignes

System.Windows.Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
System.Windows.Application.Current.Shutdown();
0