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 Services действительно хорошо и имеет все необходимое для начала работы.

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

Edit: Не зная, что будет делать ваша служба 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(); что сделает отладку намного проще.

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


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