2012-02-08 2 views
-1

Это моя первая программа для обслуживания. Если я запускаю этот код как Консоль, LOOP работает, но если я конвертирую его в сервис, он выполняет операцию изначально, но не LOOP. Не могли бы вы помочь мне исправить это? ТогоМой сервис не работает

using System; 
using System.Net; 
using KICBservice; 
using System.Data; 
using ConsoleApplication1.Classes; 
using System.IO; 
using System.ServiceProcess; 
using System.Configuration.Install; 
using System.ComponentModel; 

namespace KICBService 
{ 
    [RunInstaller(true)] 
    public class MyWindowsServiceInstaller : Installer 
    { 
     public MyWindowsServiceInstaller() 
     { 
      var processInstaller = new ServiceProcessInstaller(); 
      var serviceInstaller = new ServiceInstaller(); 

      //set the privileges 
      processInstaller.Account = ServiceAccount.LocalSystem; 

      serviceInstaller.DisplayName = "KICB_Payment"; 
      serviceInstaller.StartType = ServiceStartMode.Manual; 

      //must be the same as what was set in Program's constructor 
      serviceInstaller.ServiceName = "KICB_Payment"; 

      this.Installers.Add(processInstaller); 
      this.Installers.Add(serviceInstaller); 
     } 
    } 

    class Program : ServiceBase 
    { 
     static void Main(string[] args) 
     { 
      ServiceBase.Run(new Program()); 

      KICBservice.Service1SoapClient kicb = new KICBservice.Service1SoapClient(); 

      kicb.ClientCredentials.Windows.ClientCredential = new NetworkCredential("register", "KICBregistr1"); 
      kicb.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 

      while (true) 
      { 
       try 
       { 
        kicb.Open(); 
        StreamWriter tw = File.AppendText("c:\\KICB.log"); 

        NewPayment np = new NewPayment(); 

        np = kicb.GetPayment("register", "KICBregistr1"); 

        // Operation with Database 

        tw.WriteLine("----------------"); 
        tw.WriteLine(DateTime.Now); 
        tw.Close(); 

        kicb.Close(); 
        System.Threading.Thread.Sleep(60000); 
       } 
       catch (Exception ex) 
       { 
        kicb.Abort(); 
       } 
      } 

     } 

     public Program() 
     { 
      this.ServiceName = "KICB_Payment"; 
     } 

     protected override void OnStart(string[] args) 
     { 
      base.OnStart(args); 

      //TODO: place your start code here 
     } 

     protected override void OnStop() 
     { 
      base.OnStop(); 

      //TODO: clean up any variables and stop any threads 
     } 
    } 
} 

Я оклейки полного кода моей программы.

+0

Первое, что приходит на ум, это разрешение на обслуживание. Вы пробовали отлаживать его (или, по крайней мере, проверять журнал событий), чтобы узнать, что происходит? –

+0

Выполнение некоторых операций при запуске службы. Проблема в том, что это не цикл + –

+0

Вы уверены, что он становится в цикле в первый раз? Ответы, которые были предложены (и ваши комментарии к ним), похоже, склоняются к тому, что запуск вашего кода как службы вообще ничего не делает. Прикрепите отладчик и докажите обратное. –

ответ

2

Где находится этот первый код?

Без этого контекста самое главное, что ваш метод OnStart() запускается, а затем служба завершает работу, как только метод заканчивается, потому что ничего не остается.

Кроме того, я не являюсь поклонником шаблона while (true) { Sleep(60000); // do work } для служб. Вместо этого вы хотите найти функцию, которая на самом деле блокирует выполнение, чтобы сохранить код. Примеры включают TcpListener.AcceptTcpClient() и Thread.Join(). Если вы не можете найти что-то подобное для мяса вашего сервиса, вы можете сделать что-то вроде настройки запланированной задачи.

+0

Первый код находится в static void Main (string [] args) –

+0

@ user998878 - У Windows-сервисов нет 'Main' для каждого. –

+0

Я вставил полный код моей программы. Извините, если я объясню это неправильно –

0

Вы поместили код вне функции. То, что вы показали в вопросе, не должно даже компилироваться, и оно, конечно, не будет зацикливаться.

//TODO: Обратите внимание на комментарии в определении OnStart функции:

protected override void OnStart(string[] args) 
{ 
    base.OnStart(args); 

    //TODO: place your start code here 
} 
+0

Итак, я должен поставить эту петлю внутри OnStart()? –

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