2009-11-24 6 views
0

Mon service Windows utilise un thread (pas un temporisateur) qui est toujours en boucle et dort pendant 1 seconde chaque boucle en utilisant: evet.WaitOne (intervalle); Lorsque je démarre le service, cela fonctionne très bien et je peux voir dans le gestionnaire de tâches qu'il fonctionne, consomme et libère de la mémoire, utilise un processeur ... etc c'est normal, mais après un certain temps (quantité aléatoire de temps) le service s'arrête tout simplement !! il est toujours là dans le gestionnaire de tâches mais il ne consomme aucun travail de processeur maintenant et sa consommation à la mémoire ne change pas. tout simplement (mort mais toujours là dans le gestionnaire de tâches comme un zombie).Windows Service soudainement ne rien faire

Je sais que de nombreuses exceptions peuvent se produire lors de l'exécution du service (il fait vraiment beaucoup de choses) mais toutes ces exceptions sont gérées dans les blocs Try catch, alors pourquoi mon thread s'arrête-t-il? Ce thread se connecte également chaque fois qu'il boucle, quand il est freezig de cette façon il ne se connecte rien (bien sûr)

+0

Peut-être que vous pouvez résumer les tâches que votre service est en train de faire. Accès au réseau, accès au disque, accès au disque réseau, etc ... Si vous utilisez un 'FileSystemWatcher', cela pourrait être la cause (re-init dans' OnError') – Scoregraphic

+0

Avez-vous essayé de vérifier les journaux d'événements? – Shoban

+0

Merci, j'ai vérifié le journal des événements, il y a une erreur de quelque chose appelé: .NET 2.0 erreur d'exécution rapportant quelque chose comme ceci: Source de l'événement: .NET Runtime 2.0 Error Reporting Catégorie d'événement: Aucun L'ID d'événement: 1000 Je ne peux pas déboguer cela parce que je ne peux pas attendre exactement quand cela se produira, il pourrait arriver après 2 minutes ou 2 jours J'ai cherché cette erreur et j'ai eu beaucoup de réponses différentes sur le Web, mais aucun d'entre eux ne semble lié à mon problème actuel –

Répondre

0

J'ai découvert qu'une exception est levée à un moment donné et que cette exception ouvre une boîte de dialogue (terminer l'application ou annuler pour déboguer). Ce dialogue est étrange car je suis sûr à 100% que tout mon code de service est sûr et que toutes les exceptions sont gérées. mais il semble que l'une des DLL tierces que j'appelle de ce service appelle une bibliothèque Win32 non sûre, qui lance cette exception (je ne suis pas sûr à ce sujet jusqu'à présent mais c'est le plus possible, car si mon code est provoquant l'exception, le service se terminera). Pour découvrir cette boîte de dialogue pendant l'exécution du service Windows, j'ai exécuté le service sous (compte Système local) et j'ai coché la case (Autoriser le service à interagir avec le bureau), sans quoi je ne verrais jamais ce dialogue même s'il est montré par la DLL appelée.

Merci à tous ceux qui ont essayé d'aider

0

Avez-vous essayé d'utiliser Thread.Sleep (intervalle) au lieu de la poignée d'attente?

+0

Il n'est pas recommandé d'utiliser Thread.Sleep car cela implique plus de travail en dessous. Attendre l'événement - comme le fait l'affiche originale - c'est mieux. –

+0

Non, mais je pense qu'en utilisant evet.WaitOne (intervalle); donne au service la possibilité de réagir à toute demande externe (comme la demande d'arrêt du service) –

0

Si vous utilisez .Net 2.0 ou version ultérieure, une exception non gérée dans le thread d'arrière-plan devrait complètement tuer le processus. Donc ce ne sera probablement pas le cas.

Pour vous assurer que ce qui se passe dans votre service, je vous suggère d'utiliser windbg, le long des lignes de ce que je viens de décrire un certain temps il y a une autre question what can cause asp.net to stop responding

Je vous suggère de repérer le fil des travailleurs et émettre un !CLRStack dessus pour voir ce qui le tient. Si le thread est introuvable, il est peut-être tombé en panne (mais votre processus d'hébergement devrait également avoir planté) ou il peut avoir quitté pour une raison ou une autre. Dans ce cas, utilisez la journalisation plus généreusement.

+0

Je vais essayer, mais je me demande comment le fil "alwayes running" peut s'arrêter !! J'utilise: tandis que (vrai) { } alors il devrait boucle en permanence, et si elle s'est brisée alors (comme vous l'avez dit) le service entier devrait planter. –

+0

Ensuite, il est probablement bloqué en attente de quelque chose (IO, un autre objet de synchronisation, peu importe). Essayez de joindre avec le débogueur, ou le feu windbg sur elle. –

Questions connexes