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?
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.
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.
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.
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.
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.
internal void Close()
{
Dispatcher.CurrentDispatcher.Thread.Abort();
Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
Application.Current.Shutdown();
}
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();