C# Преобразование консольного приложения в службу

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

protected override void OnStart(string[] args)
{
   EventLog.WriteEntry("my service started");
   Debugger.Launch();
   Program pgrm = new Program();
   pgrm.Run();
}

Из комментария:

namespace MyService {
 static class serviceProgram {
  /// <summary> 
  /// The main entry point for the application. 
  /// </summary> 
  static void Main() {
   ServiceBase[] ServicesToRun;
   ServicesToRun = new ServiceBase[] {
    new Service1()
   };
   ServiceBase.Run(ServicesToRun);
  }
 }
}

2 ответа

Решение

Документация MSDN по службам Windows действительно хороша и содержит все необходимое для начала работы.

Проблема в том, что у вас есть реализация OnStart, которая должна использоваться только для настройки службы, поэтому она готова к запуску, метод должен возвращаться быстро. Обычно вы выполняете основную часть кода в другом потоке или в таймере. Смотрите страницу OnStart для подтверждения.

Редактировать: не зная, что будет делать ваша служба Windows, сложно сказать вам, как ее реализовать, но, скажем, вы хотели запускать метод каждые 10 секунд во время работы службы:

public partial class Service1 : ServiceBase
{
    private System.Timers.Timer _timer; 

    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
#if DEBUG
        System.Diagnostics.Debugger.Launch(); // This will automatically prompt to attach the debugger if you are in Debug configuration
#endif

        _timer = new System.Timers.Timer(10 * 1000); //10 seconds
        _timer.Elapsed += TimerOnElapsed;
        _timer.Start();
    }

    private void TimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
    {
        // Call to run off to a database or do some processing
    }

    protected override void OnStop()
    {
        _timer.Stop();
        _timer.Elapsed -= TimerOnElapsed;
    }
}

Здесь OnStart Метод возвращается сразу после установки таймера и TimerOnElapsed будет запущен в рабочем потоке. Я также добавил вызов System.Diagnostics.Debugger.Launch(); что сделает отладку намного проще.

Если у вас есть другие требования, отредактируйте ваш вопрос или оставьте комментарий.

Сделайте себе наибольшую пользу и используйте верхнюю полку http://topshelf-project.com/ чтобы создать свой сервис. Нет ничего проще, что я видел. Их документация просто, и развертывание не может быть проще. c:/ путь к сервису /service.exe установить.

Другие вопросы по тегам