2017-03-31 2 views
0

작은 Windows 서비스를 수행 중이며 웹 서비스에서 읽고 로컬 데이터베이스에 데이터를 저장하지만 잠시 동안 (서비스 인 동안) 실행을 완료하지 않습니다. 15 번에서 완벽하게 작동합니다. 아래 코드를 따르십시오.WindowsService가 실행되지 않는 동안

추신 : 제가 디버깅하는 데 사용했던 코드는 시작하기 전에 주석을 달았습니다. 코드를 입력하면 도착하지만 첫 번째 행만 확인하고 나머지는 확인하지 않습니다.

Program.cs

using System.ServiceProcess; 

namespace rdi_server.service 
{ 
static class Program 
{ 
    static void Main() 
    { 

     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new Service1() 
     }; 
     ServiceBase.Run(ServicesToRun); 
    } 
} 
} 

Service1.CS

using System; 
using System.Configuration; 
using System.ServiceProcess; 
using System.Threading; 

namespace rdi_server.service 
{ 
    public partial class Service1 : ServiceBase 
{ 

    private Thread _thread; 

    private Updater _updater = new Updater(); 

    private readonly int Interval = Convert.ToInt32(ConfigurationManager.AppSettings["timer"]); 
    private readonly string Connection = ConfigurationManager.AppSettings["connection"]; 

    private readonly Connector _usuarioConnector; 
    private readonly Connector _bandaConnector; 
    private readonly Connector _generoConnector; 
    private readonly Connector _musicaConnector; 

    public Service1() 
    { 
     _usuarioConnector = new Connector("UsuarioBase"); 
     _bandaConnector = new Connector("BandaBase"); 
     _generoConnector = new Connector("GeneroBase"); 
     _musicaConnector = new Connector("MusicaBase"); 

     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     StartDebug(); 
    } 

    public void StartDebug() 
    { 
     _thread = new Thread(OnTime); 
     _thread.Name = "My Worker Thread"; 
     _thread.Start(); 
    } 

    protected override void OnStop() 
    { 

    } 

    protected void OnTime() 
    { 
     while (true) 
     { 
      EventLog.WriteEntry("Dentro do WHILE foi executado!"); 
      _updater.Do(Connection, _usuarioConnector, _generoConnector, _bandaConnector, _musicaConnector); 
      EventLog.WriteEntry("Fim do while"); 
      Thread.Sleep(Interval); 
     } 
    } 
} 
} 

Updater.CS

using rdi_musica.core; 
using System.Collections.Generic; 
using System.Data.SqlClient; 

    namespace rdi_server.service 
    { 
    class Updater 
    { 
    public void Do(string Connection, 
         Connector usuario, 
         Connector genero, 
         Connector banda, 
         Connector musica) 
    { 

     var usuarios = Loader.LoadUsuarios(usuario); 
     var generos = Loader.LoadGeneros(genero); 
     var bandas = Loader.LoadBandas(banda); 
     var musicas = Loader.LoadMusicas(musica); 


     using (var connection = new SqlConnection(Connection)) 
     { 
      connection.Open(); 

      foreach (var _usuario in usuarios) 
      { 
       DomainDAO.InsertUsuario(connection, _usuario); 
      } 
      foreach (var _genero in generos) 
      { 
       DomainDAO.InsertGenero(connection, _genero); 
      } 
      foreach (var _banda in bandas) 
      { 
       DomainDAO.InsertBanda(connection, _banda); 
      } 
      foreach (var _musica in musicas) 
      { 
       DomainDAO.InsertMusica(connection, _musica); 
      } 
     } 
    } 
} 
} 
+2

, 여기 (링크를 A [mcve]을 포함하여 코드를하지 쓰기 고려하시기 바랍니다 :

당신은 당신의 무한 루프를 파괴하지 않고, 당신의 오류를 기록하는 시도 - 캐치와 함께 윈도우 이벤트 로그를 사용할 수 있습니다)이 질문은 링크가 죽은 경우 앞으로 관련성을 가질 수 있습니다. – gravity

+1

코드가 예외를 던지고 있습니까? –

+0

Re : 첫 번째 의견, 한 가지 더 설명하겠습니다. 여기에 도움이 필요하면 좋은 [mcve]를 제공해야합니다. 그렇게하면 질문을 사용할 수 없게되는 것을 방지 할 수있을뿐 아니라 질문에 대답하는 데 필요한 정보를 정확하게 제공 할 수 있습니다. 또한 [ask], 특히 그 페이지 하단에 링크 된 기사를 참고하십시오. –

답변

0

무엇 아마 어떤 상황에서 처리되지 않은 예외가 발생하여 while 루프를 벗어났습니다.

protected void OnTime() 
{ 
    while (true) 
    { 
     try 
     { 
      EventLog.WriteEntry("Dentro do WHILE foi executado!"); 
      _updater.Do(Connection, _usuarioConnector, _generoConnector, _bandaConnector, _musicaConnector); 
      EventLog.WriteEntry("Fim do while"); 
     } 
     catch (Exception ex) 
     { 
      this.EventLog.WriteEntry("ERROR: " + ex.GetType().ToString() + " : " + ex.Message + " : " + ex.StackTrace, EventLogEntryType.Error); 
     } 

     Thread.Sleep(Interval); 
    } 
} 
+0

아니, 내가 해냈어.하지만 내가 기권하는 이유는 내가 디버깅 할 때 완벽하게 작동하고, 웹 서비스에 연결하고, 정보를 가져 와서 데이터베이스에 쓴다는 것이다. –