2016-05-26 3 views
0

初めてWindowsサービスを作成してインストールしました。私が始めたとき、サービスは決して "開始されました"という状態に変わりません。ステータスは「開始」のままですが、サービスはその仕事をしています。おそらく私がOnStartメソッドとやりとりしている方法だと思いました。私は、OnStartメソッドを呼び出して、正常に実行される別のメソッドを呼び出すだけです。ここにサンプルがあります。Windowsサービスが "起動中"になっている

 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が何をするかです:Additionaly

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

、私は、イベントログをチェックし、正常に起動されたサービスのためのイベントがあります。奇妙な

+0

「Logger」とは何ですか? – ChrisF

+0

'c:/ ProgramData'は有効なパスではありません。 'C:\ ProgramData'でなければなりません。これは、ログが生成されないことを意味します。加えて、あなたのアプリケーションは 'C:\ ProgramData'に直接書くのではなく、%APPDATA%フォルダへのパスをハードコーディングするべきです。環境変数が指すフォルダの下にアプリケーションフォルダを作成する必要があります。より良いことに、[ここに記載されている](https://msdn.microsoft.com/en-us/library/system.environment.specialfolder(v = vs.110))のように 'Environemt.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) .aspx) –

+0

ありがとう@PanagiotisKanavos –

答えて

0

ありがとうございました!

新しいクラスを作成し、そのメソッドを対象とする新しいスレッドを開始しました。

protected override void OnStart(string[] args) 
    { 
     Log oLog = new Log(); 
     Thread t = new Thread(new ThreadStart(oLog.Logger)); 
     t.Start(); 
    } 
関連する問題