2016-05-26 3 views
0

Я только что создал и установил свою первую службу Windows. Когда я запускаю сервис, он никогда не меняется, его статус переходит в «Начать». Статус остается «Запуск», но служба выполняет свою работу. Я думал, что, возможно, так, как я взаимодействую с методом OnStart. Я просто получаю метод OnStart для вызова другого метода, который выполняется отлично. Вот пример:Windows Service Застрял на «старте»

 protected override void OnStart(string[] args) 
    { 
     try { 
       Logger("Start"); 
      } 
     catch (Exception ex) 
     { 
      string filePath2 = @"C:/ProgramData/Error.txt"; 

      using (StreamWriter writer = new StreamWriter(filePath2, true)) 
      { 
       writer.WriteLine(DateTime.Now + Environment.NewLine + "Message: " + ex.ToString() + Environment.NewLine + "Stack Trace: " + ex.StackTrace); 
      } 
     } 
    } 

Что мне нужно изменить, чтобы клиент мог зарегистрировать, что служба запущена и запущена. PS, служба делает то, что она должна делать.

Заранее благодарим за любую помощь!

EDIT

Это то, что делает Logger:

public void Logger(string state) 
    { 
     try 
     { 
      { 
       Random a = new Random(Environment.TickCount); 
       //unique name PhoneSystem.ApplicationName = "TestApi";//any name 
       PhoneSystem.ApplicationName = PhoneSystem.ApplicationName + a.Next().ToString(); 
      } 

      #region phone system initialization(init db server) 
      String filePath = @"C:/ProgramData/3CXLogger/3CXPhoneSystem.ini"; 
      if (!File.Exists(filePath)) 
      { 
       //this code expects 3CXPhoneSystem.ini in current directory. 
       //it can be taken from the installation folder (find it in Program Files/3CXPhone System/instance1/bin for in premiss installation) 
       //or this application can be run with current directory set to location of 3CXPhoneSystem.ini 

       //v14 (cloud and in premiss) installation has changed folder structure. 
       //3CXPhoneSystem.ini which contains connectio information is located in 
       //<Program Files>/3CX Phone System/instanceN/Bin folder. 
       //in premiss instance files are located in <Program Files>/3CX Phone System/instance1/Bin 
       throw new Exception("Cannot find 3CXPhoneSystem.ini"); 
      } 
      String value = _3cxLogger.Utilities.GetKeyValue("ConfService", "ConfPort", filePath); 
      Int32 port = 0; 
      if (!String.IsNullOrEmpty(value)) 
      { 
       Int32.TryParse(value.Trim(), out port); 
       PhoneSystem.CfgServerPort = port; 
      } 
      value = _3cxLogger.Utilities.GetKeyValue("ConfService", "confUser", filePath); 
      if (!String.IsNullOrEmpty(value)) 
       PhoneSystem.CfgServerUser = value; 
      value = _3cxLogger.Utilities.GetKeyValue("ConfService", "confPass", filePath); 
      if (!String.IsNullOrEmpty(value)) 
       PhoneSystem.CfgServerPassword = value; 
      #endregion 
      DN[] ps = PhoneSystem.Root.GetDN(); //Access PhoneSystem.Root to initialize ObjectModel 
      //_3cxLogger.SampleStarter.StartSample(args); 
     } 
     catch (Exception ex) 
     { 
      string filePath2 = @"C:\ProgramData\3CXLogger\Error.txt"; 

      using (StreamWriter writer = new StreamWriter(filePath2, true)) 
      { 
       writer.WriteLine(DateTime.Now + Environment.NewLine + "Message: " + ex.ToString() + Environment.NewLine + "Stack Trace: " + ex.StackTrace); 
      } 
      //Console.WriteLine(ex.ToString()); 
     } 
     string constring = "Data Source = LEWCOMP1\\COMPLIANCE; Initial Catalog = 3CXCallStats; Integrated Security = True"; 


     while (state == "Start") 
     { 
      Thread.Sleep(5000); 
      int count = 0; 
      foreach (DN dn in PhoneSystem.Root.GetDN()) 
      { 
       ActiveConnection[] a = dn.GetActiveConnections(); 
       foreach (ActiveConnection ac in a) 
       { 
        try 
        { 
         if (ac.Status == ConnectionStatus.Connected) 
         { 
          count = count + 1; 
         } 
        } 
        catch (Exception ex) 
        { 
         //Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine + ex.Source); 
         string filePath2 = @"C:\ProgramData\3CXLogger\Error.txt"; 

         using (StreamWriter writer = new StreamWriter(filePath2, true)) 
         { 
          writer.WriteLine(DateTime.Now + Environment.NewLine + "Message: " + ex.ToString() + Environment.NewLine + "Stack Trace: " + ex.StackTrace); 
         } 
        } 
       } 
      } 
      count = count/2; 
      string update = "UPDATE callsCounter SET Counter = '" + count + "' WHERE ID='1';"; 
      string insert = "INSERT Interval_Counter (Date_Time, Count) VALUES ('" + DateTime.Now + "','" + count + "')"; 
      SqlConnection myCon = new SqlConnection(constring); 
      SqlCommand updateCMD = new SqlCommand(update, myCon); 
      SqlCommand insertCMD = new SqlCommand(insert, myCon); 
      SqlDataReader myReaderUpdate; 
      SqlDataReader myReaderInsert; 

      myCon.Open(); 
      myReaderUpdate = updateCMD.ExecuteReader(); 
      myReaderUpdate.Read(); 
      myCon.Close(); 


      myCon.Open(); 
      myReaderInsert = insertCMD.ExecuteReader(); 
      myReaderInsert.Read(); 
      myCon.Close(); 
     } 
    } 

Additionaly, я проверил журналы событий и есть события для службы успешно началась. Странный.

+0

Что делает 'Logger'? – ChrisF

+0

'c:/ProgramData' не является допустимым путем. Это должно быть 'C: \ ProgramData'. Это означает, что журнал не будет создан. Кроме того, ваше приложение должно * НЕ писать в 'C: \ ProgramData' напрямую, а не жестко указывать путь к папке% APPDATA%. он должен создать папку приложения под папкой, указанной переменной окружения. Еще лучше использовать 'Environemt.GetFolderPath (Environment.SpecialFolder.LocalApplicationData)' как [описано здесь] (https://msdn.microsoft.com/en-us/library/system.environment.specialfolder (v = vs.110) .aspx) –

+0

Спасибо @PanagiotisKanavos –

ответ

0

Спасибо за помощь!

Создал новый класс и начал новый поток, нацеленный на метод.

protected override void OnStart(string[] args) 
    { 
     Log oLog = new Log(); 
     Thread t = new Thread(new ThreadStart(oLog.Logger)); 
     t.Start(); 
    } 
Смежные вопросы