2010-05-08 7 views
7

J'ai un service Windows écrit en .NET 3.5 (C#) avec un System.Threading.Timer qui engendre plusieurs Threads dans chaque rappel. Ce sont juste des threads normaux (pas de pool de threads) et j'ai mis le IsBackground = true sur chaque thread puisque je vais seulement exécuter du code managé. Lorsqu'un utilisateur arrête le service, qu'arrive-t-il à tous les threads? Est-ce qu'ils meurent gracieusement? Je n'ai aucun code qui gère les threads en appelant join ou abort. Est-il correct de supposer que le IsBackground = true est suffisant pour supposer que les threads seront éliminés et arrêtés lorsqu'un utilisateur arrête le service? Que se passe-t-il exactement lorsque quelqu'un arrête un service Windows via l'interface graphique de Service Manager? Est-ce que cela tue le processus après qu'il déclenche l'événement OnStop? Cela pourrait être acceptable pour moi parce que j'ai construit un mécanisme séparé qui permet à un utilisateur de savoir à coup sûr qu'il n'y a pas de threads avant d'arrêter le service. Cela est effectué via 2 méthodes WCF exposées à partir d'un ServiceHost qui s'exécute dans le service Windows. Il existe une méthode pour arrêter de générer de nouveaux threads et une autre méthode pour interroger le nombre de threads en cours d'exécution.Arrêt d'un service Windows qui a des threads

Je suis juste curieux de savoir ce qui se passe si elles sauter ces étapes et juste arrêter le service ... Il semble que le IsBackground aide y parvenir:

Répondre

6

À partir du lien MSDN que vous avez fourni:

A thread est soit un thread d'arrière-plan ou un thread de premier plan. Les threads d'arrière-plan sont identiques aux threads de premier plan, sauf que les threads d'arrière-plan n'empêchent pas un processus de se terminer. Une fois que tous les threads de premier plan appartenant à un processus se sont terminés, le Common Language Runtime termine le processus. Les threads d'arrière-plan restants sont arrêtés et ne se terminent pas.

Définition d'une propriété de fil IsBackground à true permettra à votre service Windows de mettre fin immédiatement une fois que le rappel est terminé OnStop() exécuter et toutes les discussions de premier plan (le cas échéant) ont quitté. Les threads d'arrière-plan seront arrêtés partout où ils se trouvent dans leur état d'exécution. Par conséquent, si ces threads doivent se terminer correctement, vous devrez utiliser un mécanisme différent. Une façon de procéder consiste à utiliser des threads de premier plan qui vérifient un objet ManualResetEvent qui signale l'arrêt des threads. Dans votre rappel OnStop(), définissez le ManualResetEvent puis attendez que les threads à quitter en utilisant Join(). S'ils ne sortent pas dans un délai raisonnable, vous pouvez les terminer avec force depuis la fin du processus.

+0

Merci, ceci fonctionne très bien! – ECC

Questions connexes