[C#] System.ServiceProcess.ServiceBase.OnShutdown

J’ai dans ma poche gauche un service Windows développé en C# (en .net 2.0 beta 2) qui fait tout un tas de traitements relativement longs.

Pour ce service, l’appel des méthodes OnStart, OnPause, OnContinue et OnStop par le Service Control Manager (ou SCM pour les intimes) peut donc prendre assez de temps pour parfois m’obliger à appeler RequestAdditionalTime() pour notifier au SCM que le service répond bien.

Problème: MSDN dans ma poche droite me dit que RequestAdditionalTime() ne peut être appelé dans une méthode OnShutdown.

En effet, lors de l’arrêt de la machine, j’ai bien mon appel de méthode OnShutdown mais le serveur s’arrête avant même que le service ait fini ses traitements (qui peuvent être longs…) … :stuck_out_tongue:

Je n’ai pas trouvé de solution à ce problème, et malgré ce que dit MSDN, OnShutdown ne se comporte pas comme un OnStop… (pour exemple, lors d’un OnShutdown, le journal des événements n’est plus disponible pour y inscrire les différents problèmes d’arrêt).

Bah, on va juste dire que normalement, t’as pas a faire attendre le SCM lors de la fermeture de windows…

Ouais, en effet, c’est chiant, mais faut t’estimer heureux que le process se fait pas killer direct.

Une solution a envisager serais de mettre les données mémoire de coté vite fait, pour les traiter au redemarrage du service. Enfin, tout dépends de ce que fais le service…

L’appli est multithreadée.
Elle fait, en méga gros, de la réception de messages MSMQ, des appels ADO.NET et de l’envoi/réception de données sur de l’HTTP.

Le tout est assez cloisonné, avec du transactionnel, logging sur disque et écriture de fichiers sur disque pour la reprise après panne.

Hum comment font IIS ou SQL Server pour s’arrêter proprement et rapidement lors d’un shutdown alors qu’ils peuvent mettre plusieurs minutes pour un stop sous la charge ?

Sauvegarde de l’état actuel sur le disque et rechargement de cet état au démarrage?