2010-03-12 8 views
5

Quelle est la meilleure façon de terminer une application multi-thread de manière propre?
Je commence plusieurs connexions socket du fil conducteur dans des prises séparées et attendre jusqu'à la fin de ma journée d'affaires dans le thread principal et utiliser actuellement System.Environment.Exit(0) d'y mettre fin.Multi-Threading - Stratégie de nettoyage à la fin du programme

Cela conduit à une exception non gérée dans l'un des Childs. Dois-je arrêter les discussions de la liste? J'ai été réticent à mettre en place un réel arrêt chez les enfants, donc je m'interroge sur la meilleure pratique. Les prises sont toutes bien emballées avec des destructeurs appropriés pour se déconnecter et se fermer, mais cela entraîne toujours des erreurs.

Répondre

2

Pour fils manualy créé, vous devez définir IsBackground propriété à vrai. Dans ce cas (si tous vos threads sauf le principal) serait en arrière-plan, vous fermez l'application gracieusement après le retour de la fonction Main (string [] arg).

P.S. Tous les threads de pools de threads sont en arrière-plan.

+5

Faire tous vos fils de threads de travail de fond peuvent éviter tout cris de mort que les sorties de processus, mais il est peu gracieux. Les threads d'arrière-plan sont terminés, même s'ils sont en train de faire quelque chose, une fois que tous les threads de premier plan sont terminés. – OldFart

+0

J'ai implémenté ceci et je vais le tester lundi. – weismat

+0

Testé et travaillé comme un charme. – weismat

0

Chaque fois que vous faites une longue attente bloquée (comme l'attente d'une connexion entrante) utiliser Begin/formulaire de fin de la méthode. Ensuite, utilisez un ManualResetEvent pour représenter la condition 'should exit'. Puis bloquer sur AsyncWaitHandle et l'événement de sortie. Cela vous permettra de terminer proprement.

Exemple:

// exit is a ManualResetEvent 
var asyncResult = socket.BeginAccept(null, null); 
if(WaitHandle.WaitAny(new[] { exit, asyncResult.AsyncWaitHandle }) == 0) 
    return; 
var connection = socket.EndAccept(asyncResult); 

Et dans votre principale méthode lorsque vous voulez quitter:

exit.Set(); 
Questions connexes