2009-09-22 10 views
1

J'utilise VSTS 2008 + C# + .Net 3.5 pour développer une application de service Windows. Le code est très simple ci-dessous, et je trouve quand File.Copy jette une exception (par exemple chemin non valide, pas d'autorisation, etc.), le service va planter et ouvrir une boîte de dialogue pour me permettre de déboguer. Ma confusion est, je pense que l'exception non gérée d'un thread créé par un service Windows ne fera jamais planter le service. Pourquoi mon service plante-t-il et la boîte de dialogue de débogage apparaît-elle?pourquoi le service Windows plante?

public partial class Service1 : ServiceBase 
    { 
     public Service1() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      Thread t = new Thread (WriteF); 
      t.Start(); 
     } 

      static void WriteF() { 
       File.Copy("dummy.txt", @"\\somelocation\dummy.txt"); 
      } 

     protected override void OnStop() 
     { 
     } 
    } 
+1

err ... parce qu'il y a un bug dedans? – wefwfwefwe

+0

Gzillions virtuels de points. Où est l'incitation à répondre? Je pensais que c'était autre chose. – Khash

Répondre

6

Je pense exception non gérée d'un fil créé par un service Windows ne fera jamais l'accident de service

Votre hypothèse est tout simplement faux. Les exceptions non gérées dans un service Windows provoqueront un blocage. La boîte de dialogue de débogage s'affiche car un débogueur est configuré sur votre système. À partir de .NET 2.0, une exception non gérée sur un thread ferme l'ensemble de l'application. Juste parce que vous utilisez un fil ne signifie pas que les exceptions dans le fil disparaîtront comme par magie.

+0

Exception levée à partir de tous les threads du service Windows provoquera le crash du service Windows? – George2

+2

Oui. Ce n'est pas unique aux services, c'est la même chose pour n'importe quelle application. – blowdart

+0

Merci, question répondue! – George2

2

Votre opération de copie de fichier génère une exception qui n'est pas interceptée. Aussi simple que cela. Le service échouera sauf si vous encapsulez l'opération File.Copy dans un bloc try catch. Peu importe que l'opération soit effectuée sur un thread d'arrière-plan. Je suggère également d'ajouter un enregistrement, sinon vous ne découvrirez pas pourquoi il échoue.

+1

Je ne suis pas sûr si c'est la même chose, mais nous avons eu auparavant d'un service, nous créons un thread thread principal (qui fonctionne comme ne pas tenir le service). Il récupère ensuite une liste d'utilisateurs et boucle les utilisateurs, créant un thread pour chaque utilisateur pour effectuer la tâche. Dans les événements où un thread avait une exception non gérée, les autres threads étaient complets. Suis-je quelque chose ou est-ce différent de la question? –

+0

Exception levée à partir de tous les threads du service Windows provoquera le blocage du service Windows? – George2

0

Vous démarrez un nouveau thread pour exécuter le code dans WriteF. Si ce code échoue avec une exception, l'exécution essaiera de trouver un gestionnaire d'exceptions en déroulant la pile pour ce thread particulier. Si elle ne parvient pas à localiser un gestionnaire, le moteur d'exécution n'a pas d'autre option que le rapport, une exception non gérée et donc le processus est terminé. Rappelez-vous que la gestion des exceptions est par thread. Ce problème ne concerne pas le service Windows.

Questions connexes