2010-09-05 3 views
3

Je n'ai jamais écrit un service Windows avant et j'ai pensé que tout allait bien jusqu'à ce que je l'ai déployé pour vivre. En dev ça marche bien et le polling est génial, mais dès qu'il est en production il tombe sur son dos après sa première boucle.Problème de thread simple avec le service Windows

The exception I recieve is: 
Application: ProgramName.WinService.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.Exception 
Stack: 
    at ProgramName.WinService.UpdateChecker.StartChecks() 
    at ProgramName.WinService.UpdateChecker.StartPolling() 
    at System.Threading.ThreadHelper.ThreadStart_Context(System.Object) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
    at System.Threading.ThreadHelper.ThreadStart() 

et est le code ici qui fait la mise en boucle:

 private readonly Thread pollingThread; 

    public UpdateChecker() 
    { 
     pollingThread = new Thread(StartPolling); 
     InitializeComponent(); 
    } 

     protected override void OnStart(string[] args) 
     { 
      pollingThread.Start(); 
     } 

     protected override void OnStop() 
     { 
      pollingThread.Abort(); 
     } 


     protected void StartPolling() 
     { 
      do 
      { 
       StartChecks(); 

       //10 seconds 
       Thread.Sleep(10000); 
      } while (true); 

     } 

Est-ce que quelqu'un a une idée pourquoi ce serait tomber après avoir exécuté la première fois? est-ce que je fais quelque chose de stupide?

Cette méthode est la cause du problème:

public static string GetXmlFromFeed (string strUrl) {var rssReq = WebRequest.Create (strUrl); var rep = rssReq.GetResponse(); return new StreamReader (rep.GetResponseStream()). ReadToEnd(); }

Sur le GetResponse()

possible un temps et rien à voir avec le filetage du tout alors

+0

L'exception est lancée dans 'StartChecks'; pouvez-vous partager le code de cette méthode? –

+1

Une suggestion de note de côté: Je voudrais changer .Abort() à la définition d'un booléen bStopThreads = true, puis rejoindre le fil de travail avec .Join() Si ce délai expire, puis appelez .Abort(). Utilisez votre bStopThreads dans votre boucle while. – hydrogen

+0

Des exceptions internes? – cwap

Répondre

1

regardant la pile d'exception trace, il semble que le StartChecks déclenche une exception qui n'est pas manipulé et il se propage au thread appelant (this behavior was introduced in .NET 2.0 comme avant que les exceptions jetées dans les fils enfants ne soient propagées). Essayez de l'entourer d'un try/catch afin de gérer cette exception.

+0

Je pense que j'ai juste besoin d'un peu d'essayer de rattraper le problème mentionné ci-dessus et il sera tout bon de partir, merci à tous – JamesStuddart

Questions connexes