2009-07-16 7 views
4

Où puis-je trouver une vue détaillée du cycle de vie d'un service Windows tel que développé dans .NET? J'ai posé ma question de cette façon parce que je ne suis pas sûr qu'une description suffisamment détaillée puisse être affichée ici, mais si vous pensez que vous pouvez vous sentir libre d'essayer.Où puis-je trouver une vue détaillée du cycle de vie d'un service Windows tel que développé dans .NET?

Un exemple d'une réponse incorrecte serait un paste de la description de la page MSDN: Introduction to Windows Service Applications. Ce n'est pas assez détaillé. Par exemple, un service est-il déchargé de la mémoire, et par conséquent la méthode Dispose est appelée? Ou est-il simplement arrêté par la méthode OnStop, pour être redémarré sans initialisation en appelant la méthode OnStart?


En raison du fait que ma question a été répondue, et présente une autre question en même temps, voici quelques références à opposer des cycles de vie (que je sais maintenant s'applique également aux services) destinés à être utilisés par les futurs visiteurs à cette question:

StackOverflow - What is the .NET object life cycle?

tutorials.beginners.co.uk/read/id/188

developerfusion.com/article/1047/new-objectoriented-capabilities-in-vbnet/3/

Amusez-vous!

Répondre

7

Le service Windows est effectivement une application avec quelques méthodes supplémentaires exposées pour le gestionnaire de services pour le contrôler, à savoir Stop(), Start(), Pause(), Continue() (ou équivalents). Lorsque vous appelez Start, le domaine d'application est créé, la classe de service est initialisée et la méthode Start() est appelée. A l'arrêt, la méthode Stop() est appelée avant que le domaine d'application ne soit déchargé de la mémoire.

Vous pouvez le voir avec le gestionnaire de tâches. L'application n'existe pas en mémoire jusqu'à ce que le démarrage soit appelé et disparaît après l'arrêt de l'arrêt. Par conséquent, je crois que la réponse à votre question sur le cycle de vie réside dans le cycle de vie d'une application .NET standard, que ce soit en ligne de commande, winforms ou asp.net.

Je vous signale également que si vous dépendez de la méthode Dispose, il y a probablement une faille dans votre conception. Dans la plupart des cas, les ressources nettoyées par Dispose doivent être éliminées plus fréquemment que lorsque le service L'hôte appelle votre composant à Dispose. La plupart des services sont généralement un mécanisme pour répondre à un événement système quelque part, dans les cas où cet événement provient d'une ressource non gérée, vous voulez probablement récupérer la ressource OnStart et la libérer OnStop, dans les situations où l'événement n'est pas géré espace alors vous voulez probablement attraper et libérer les ressources non managées d'une manière plus juste de type JustInTime où vous les attrapez comme une ressource seulement quand vous en avez besoin et les libérez (via leur méthode Dispose) dès que vous le pouvez. Pour plus de lecture, consultez When and how to use dispose et .Net dispose pattern

+0

Ceci est une très bonne réponse, il y a un seul point que je voudrais clarifier. Vous dites "si je suis dépendant de la méthode Dispose, il y a probablement un défaut ... dans [mon] design". Je suis un peu confus par cela. Est-ce que l'instance de ServiceBase hébergeant mon service n'appelle pas Dispose? Actuellement, j'utilise New() pour initialiser mes objets, OnStart pour les configurer et les "démarrer" pour ainsi dire, OnStop pour les arrêter, et Dispose pour appeler les méthodes Dispose pour mes composants, objets gérés, objets non gérés et 'set large champs à null '.J'avais l'impression que c'est pour cela que Dispose doit être utilisé. –

+0

Votre droit. J'ai mon Dispose et Finalize embrouillé, mais mon intention était toujours correcte, j'ai modifié le dernier paragraphe pour correspondre. –

Questions connexes