Правильный способ запуска службы Windows - PullRequest
0 голосов
/ 15 октября 2018
    #if DEBUG
            MainService service1 = new MainService();
            service1.onDebug();
            System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
            ConfigurationSync.logDebugMessage(logMessageType.message, "Starting main service thread");

#else
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                new MainService()
            };
            ServiceBase.Run(ServicesToRun);
            ConfigurationSync.logDebugMessage(logMessageType.message, "Starting main service thread");

#endif

Я создал свою первую службу Windows, и мне интересно, как правильно запустить службу в файле Program.cs.

Приведенный выше код - это то, что было предложено мнеонлайн-приём, #if debug, запущенный во время тестирования в Visual Studio, и блок else, запущенный при сборке в режиме выпуска и установленный на сервере.Проблема в том, что он не запускается на сервере после установки, если я не использую код в блоке кода #if debug.Если я запускаю код, как указано выше, он говорит, что служба запущена, но, похоже, ничего не происходит, а если я только запускаю то, что находится в блоке debug, служба запускается, но я получаю ошибку на сервере "Service failed to start in a timely manner"

Буду признателен за любую помощь

Обновление: в моем mainservice у меня есть функция, которая запускает все функции службы, эта функция startSoftwareUpdates();

Это те функции, которые у меня естьв MainService:

        public MainService()
    {
        startSoftwareUpdates();

        public void onDebug()
    {

        OnStart(null);
    }

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

Обновление 3:

Итак, я переставил MainService следующим образом:

        public MainService()
    {
        InitializeComponent();
    }

    public void onDebug()
    {

        OnStart(null);
    }

    protected override void OnStart(string[] args)
    {
        new Thread(() =>
        {
            Thread.CurrentThread.IsBackground = true;
            startSoftwareUpdates();
        }).Start();
    }

С какими проблемами я могу столкнутьсяс таким подходом?Я бы тоже хотел, чтобы поток работал бесконечно ...

1 Ответ

0 голосов
/ 15 октября 2018

Ничего не выглядит неправильно с вашим кодом.Если бы вы могли опубликовать еще немного кода, который находится внутри вашего MainService() конструктора, это было бы полезно, учитывая, что это может быть причиной проблемы.

Однако, когда я создаю эти службы, вместо маршрута #if DEBUG, я обычно делаю что-то вроде этого

if (Environment.UserInteractive)
{
      //**** this is for debugging in console mode
}
else
{
     //*** this is for running as a Windows service
     var ServicesToRun = new ServiceBase[]
     {
          new ServiceHome()
     };
     ServiceBase.Run(ServicesToRun);
}

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

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

Редактировать

Я не верю, что проблема связана с любым кодом, который вы написали.Ошибка, которую вы получаете, вызвана рядом потенциальных проблем, поэтому сложно сказать вам точно, что это такое. Здесь - это ссылка, на которой есть несколько решений, которые вы можете попробовать.Кроме того, вы должны попытаться найти ошибку в Event Log, предполагая, что вы работаете на компьютере с Windows.Это будет иметь больше деталей к проблеме в большинстве случаев.

...