Question

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

Parfois, lorsque je le ferme, il y a des fils qui 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 un problème pour trouver tous ces fils et les ajouter à l'événement de clôture.

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

Merci.

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

Était-ce utile?

La solution

Cette ne devrait pas se produire, et si c'est le cas, vous essayez de le résoudre dans le mauvais sens.

Lorsque votre application sort, le .NET Framework tuera automatiquement tous les threads dont IsBackground propriété est défini sur "vrai". Désignez chacun de vos fils de travail comme fils d'arrière-plan, et vous n'aurez plus ce problème. Profiter du BackgroundWorker classer et le ThreadPool classer, qui créent automatiquement des threads d'arrière-plan, est une bien meilleure option.

Sinon, vous devez nettoyer explicitement vos fils de premier plan. Une application correctement conçue fera sa propre comptabilité et aura une manière déterministe et structurée de s'assurer que tous ses fils ont été fermés avant de quitter le Main méthode. C'est ce que tu devrais faire De toute façon Si vos fils nécessitent une résiliation gracieuse.

Tuer le processus est une très mauvaise idée, tout comme la laisse fonctionner vos fils sur votre application.

Autres conseils

Vous pouvez utiliser: Environment.exit (0); , cela fermera l'application si les threads s'exécutent et ne causeront aucun problème.

Vous devez fermer gracieusement vos fils, mais vous voulez juste que vous et les autres sachez la façon dont cela n'est pas recommandé mais possible:

Sur votre gestionnaire d'onclose:

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

Je préfère totalement Cody Gray Way de le faire.

Eh bien, tu pourrais appeler Application.Exit() Mais cela ne vous aidera pas beaucoup. L'essentiel est que vous devez fermer gracieusement tous les fils vous-même si vous voulez faire les choses correctement.

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

Essayez de forcer l'arrêt

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

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

  1. A suivi le lien.Application du formulaire Windows, le thread ne s'arrêtera pas
  2. La première étape ne l'a pas résolu. Environnement.exit (0); - résout et a bien fonctionné.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top