2010-09-05 2 views
3

Я до сих пор не писал службы Windows и думал, что все идет хорошо, пока я не развернул ее, чтобы жить. В dev он отлично работает, и опрос очень хорош, но как только он выходит в производство, он падает на свою заднюю часть после первого цикла.Простая проблема с потоками с услугой 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() 

и вот код, который делает зацикливание:

 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); 

     } 

Кто-нибудь есть какие-либо идеи, почему это будет падать более после того, как он работает в первый раз? я делаю что-то глупое?

Этот метод вызывает вопрос:

общественности статической строки GetXmlFromFeed (строка strUrl) { вар rssReq = WebRequest.Create (strUrl); var rep = rssReq.GetResponse(); возвращает новый StreamReader (rep.GetResponseStream()). ReadToEnd(); }

На GetResponse()

возможно время, и ничего общего с резьбой на всех, то

+0

Исключение выбрасывается внутри 'StartChecks'; можете ли вы поделиться кодом этого метода? –

+1

Рекомендация со стороны: я бы изменил .Abort() на установку boolean bStopThreads = true, а затем соединение с рабочим потоком с .Join() Если это время, вызовите .Abort(). Используйте bStopThreads в цикле while. – hydrogen

+0

Любые внутренние исключения? – cwap

ответ

1

Глядя на стек исключений трассировки, кажется, что StartChecks бросает исключение, которое не является обрабатывается и распространяется на вызывающий поток (this behavior was introduced in .NET 2.0, так как до сих пор не распространялись исключения, возникающие в дочерних потоках).

Попробуйте поместить вокруг него try/catch, чтобы справиться с этим исключением.

+0

Я думаю, что мне просто нужно попытаться поймать повтор вокруг вышеупомянутой проблемы, и все будет хорошо, спасибо всем – JamesStuddart

Смежные вопросы