2012-03-16 2 views
3

Я смог создать простое приложение для Windows. просто рамка. но я все еще смущен. где я должен поместить свой код для службы Windows, чтобы на самом деле что-то сделать. У меня есть отдельная программа, которую я хотел бы включить/включить/включить здесь. где следует поставить программу? с чего начать?COS windows services program

public partial class MyNewService : ServiceBase 
{ 
    public MyNewService() 
    { 
     InitializeComponent(); 
     if (!System.Diagnostics.EventLog.SourceExists("MySource")) 
     { 
      System.Diagnostics.EventLog.CreateEventSource(
       "MySource", "MyNewLog"); 
     } 
     eventLog1.Source = "MySource"; 
     eventLog1.Log = "MyNewLog"; 
    } 




    static void Main() 
    { 
     System.ServiceProcess.ServiceBase[] ServicesToRun; 
     // Change the following line to match. 
     ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() }; 
     System.ServiceProcess.ServiceBase.Run(ServicesToRun); 
    } 
} 

}

ответ

3

Вам необходимо переопределить метод OnStart (и другие подобные, например, OnStop, OnShutdown и т.д.).

Когда вы это сделаете, убедитесь, что ваш метод OnStart не блокирует или занимает очень много времени. Это часто означает использование вашей фактической логики обслуживания в ее собственной теме.

0

Override следующие методы на вашем MyNewService при необходимости:

protected virtual void OnContinue(); 
protected virtual void OnCustomCommand(int command); 
protected virtual void OnPause(); 
protected virtual bool OnPowerEvent(PowerBroadcastStatus powerStatus); 
protected virtual void OnSessionChange(SessionChangeDescription changeDescription); 
protected virtual void OnShutdown(); 
protected virtual void OnStart(string[] args); 
0

Вы реагировать на различные события, посланных с помощью On____ методов (они являются виртуальными, так что вы можете изменить их).

В частности, в простейшем случае:

protected override void OnStart(string[] args) 
{ 
    //Do stuff here 
} 
1

В this walkthrough, он говорит, что вы переопределить OnStart().

Если вы не привязаны к использованию этого шаблона программы Windows Service, вам может понадобиться check out this library, что значительно упростит сервисы программирования. Прямо сейчас исполняемый файл службы, который вы создаете, нельзя запускать напрямую - он может быть установлен только. Библиотека Hoytsoft устанавливает, а затем автоматически запускает ее для вас, как обычное приложение Windows Form.

0

Вы должны переопределить функцию OnStart(). Я предлагаю переместить весь код, который у вас есть в конструкторе, в той же функции, так как рекомендуется оставить конструктор пустым (это не только для служб, но это еще одна история). В начале вы обычно включаете один или несколько потоков, выполняющих требуемую работу. Помните, что OnStart() должен как можно дальше возвращаться. Возможно, вам понадобится реализовать некоторую логику в функции OnStop(), чтобы изящно блокировать рабочие потоки.

0

Как уже было сказано, не помещайте свой код в OnStart(). Зачем? Потому что, если ваш метод OnStart() не возвращается быстро, диспетчер службы будет отмечать ваш сервис как невосприимчивый и отключит вас.

Итак, я поместил свой код в метод Start(), и все OnStart() это вызов Start(). Как так:

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

    public static void Start() 
    { 
     ... do stuff 
    } 

Кроме того, имейте в виду, что ваш код для запуска службы будет вести себя различным в зависимости от того, являются ли вы в компиляции или в режиме отладки.

System.ServiceProcess.ServiceBase[] ServicesToRun; // Change the following line to match. ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun);

Я делаю это, чтобы убедиться, что он ведет себя правильно, и я не должен помнить, чтобы изменить код назад и вперед, чтобы запустить или отладку.

 if(Debugger.IsAttached) 
      Service.Start(); 
     else 
     { 
      ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
      { 
       new Service() 
      }; 

      ServiceBase.Run(ServicesToRun); 
     } 
0

Переопределить метод OnStart() для вызова вашей бизнес-логики.Как уже упоминалось ранее, вы можете создать другой поток, чтобы иметь функциональность, или использовать Eventhandlers с таймерами (с повторением потока), чтобы активировать логику бизнес-процессов. Служба должна вернуть управление ОС, и, следовательно, метод Onstart должен вернуть управление окнам во время работы службы.

Чтобы управлять, приостанавливать, возобновлять, выключать питание, в случае событий «Остановить» вам необходимо переопределить эти методы и написать там свою логику.