2009-10-19 14 views
0

J'ai conçu un service Windows en C#, qui s'exécute en continu et génère trois threads. Le premier thread s'exécute toutes les 15 s. Le deuxième thread s'exécute toutes les min. Et les thirs ne s'exécute qu'une seule fois.Raisons pour lesquelles le service Windows doit s'arrêter

Mon problème est que ce service de Windows s'arrête d'une manière ou d'une autre après quelques jours. Il n'y a rien de journal dans le journal des événements le jour de l'arrêt. Et il n'a rien écrit dans le fichier de journalisation.

Je veux savoir quelles sont les différentes raisons pour lesquelles un service Windows s'arrête brusquement. Et ce service n'est pas sur ma boîte de DEV, il est sur le serveur de QA.

espérons que cela a du sens!

Répondre

2

Vous avez probablement une exception non gérée sur l'un de vos threads - depuis .NET 2.0, les exceptions non gérées vont couper le processus brusquement comme ça. Assurez-vous que le haut de la pile pour tout ce que vous exécutez sur un thread a un bloc catch pour gérer les erreurs (log, swallow, marshal à un autre thread, peu importe). Vous pouvez empêcher temporairement ce comportement (par exemple, revenir au comportement pre-.NET 2.0) en ajoutant ce qui suit au fichier .exe.config de votre service:

<configuration> 
    <runtime> 
    <legacyUnhandledExceptionPolicy enabled="1" /> 
    </runtime> 
</configuration> 

mais ne comptez pas sur it- il peut être retiré dans une future version .NET (n'a pas vérifié 4.0- il peut déjà être parti).

+0

Ceci est correct. Chaque thread * doit * avoir un bloc try/catch qui attrape n'importe quelle 'Exception' et gère l'échec gracieusement (log to Event Log est une bonne solution si rien d'autre n'est applicable). Dans le cas contraire, une exception non gérée dans un thread détruira tout votre service. –

+1

Si vous n'utilisez pas la journalisation failstop (c'est-à-dire que le journal des événements peut afficher des autorisations), assurez-vous que le code de gestion des erreurs comporte également un try/catch ou un échec du journal. – nitzmahone

+0

@Daniel Pryden: Une exception dans un thread ne sera-t-elle pas interceptée par un gestionnaire 'AppDomain.UnhandledException'? Ou n'est-ce pas un moyen fiable? –

Questions connexes