2009-11-11 7 views
0

HI Guys, J'ai créé un service Windows qui génère trois threads. Le premier thread se réveille toutes les 15 secondes, le second thread se réveille toutes les min. et le troisième fil une fois par jour. Mon code ressemble à ceci:Le service .NET Windows s'est arrêté brusquement

 var timer1 = new Timer(); 
     timer1.Elapsed += ProcessTimerEvent1; 
     timer1.Interval = 60000; 
     timer1.Start(); 

     var timer2 = new Timer(); 
     timer2.Elapsed += ProcessTimerEvent2; 
     timer2.Interval = 15000; 
     timer2.Start(); 

     var timer3 = new Timer(); 
     timer3.Elapsed += ProcessTimerEvent3; 
     timer3.Interval = 86400000; 
     timer3.Start(); 

De mes journaux d'événements, je vois qu'il dit une erreur d'exécution .NET 2.0 Rapport EVENTID: 5000. J'ai regardé à travers le réseau et il dit une exception d'opération invalide.

Pensez-vous que cet arrêt de service doit faire n'importe quoi avec des threads. Et l'autre question idiote est que je reproduis 3 nouveaux threads à chaque fois ou les mêmes threads se lèvent chaque 15 sec ou 1 min.

Répondre

2

L'un de vos threads génère probablement une exception non gérée . Cela permettra à votre processus de mourir immédiatement. Assurez-vous que vous gérez toute exception à l'intérieur de vos threads à un moment donné en enveloppant le code dans le thread dans try-catch-blocks (et n'oubliez pas de vous connecter correctement afin que vous puissiez être au courant des choses qui vont mal).

0

Cela est probablement dû à une exception dans le code d'un de vos événements.

0

gardez-vous une référence des temporisateurs sur certains objets globaux (statiques)? Si ce n'est pas le cas, ils sont candidats à la collecte des ordures. Le CG appellera leurs destructeurs qui à leur tour appelleront la méthode Dispose et vos fils seront brusquement arrêtés.

Pour la question sur les secondes; les minuteurs utilisent le pool de threads pour engendrer des threads. Chaque traitement récupère un thread du pool, l'utilise et le libère. Entre les périodes, ils attendent simplement les notifications de l'horloge du système.

0

Alice,

Vous pouvez ajouter Unhandled Gestion des exceptions à votre service avec le code comme ceci: -

namespace YourNamespace 
{ 
    static class Program 
    { 

     [STAThread] 
     static void Main() 
     { 
      AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
      Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 
      Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
     } 

     static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) 
     { 
      HandleException(e.Exception); 
     } 

     static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
     { 
      HandleException((Exception)e.ExceptionObject); 
     } 

     static void HandleException(Exception e) 
     { 
      //Handle/Log Exception Here 
     } 

    } 
} 

Merci,

Phil

http://exceptioneer.com

Questions connexes