Тайм-аут запуска службы Windows

Есть ли способ установить другое значение времени ожидания запуска службы для каждой службы? Я могу изменить его с помощью раздела реестра ServicesPipeTimeout, но это для каждой машины (http://support.microsoft.com/kb/824344).

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


person Meidan Alon    schedule 19.10.2008    source источник


Ответы (4)


Хорошей практикой является завершение запуска службы как можно быстрее. Таким образом, в состоянии start делайте только то, что абсолютно необходимо для подтверждения успешного запуска; а остальное сделать позже. Если запуск по-прежнему занимает много времени, используйте SetServiceStatus периодически информировать Диспетчер управления службами о том, что вы еще не закончили работу, чтобы не прерывать работу службы по тайм-ауту.

person Rômulo Ceccon    schedule 19.10.2008
comment
Имейте в виду, однако, что если есть другая служба, зависящая от вашей собственной, она, вероятно, будет ожидать, что ваша служба будет полностью функциональной после того, как она опубликует SERVICE_RUNNING. Это хорошая причина завершить все инициализацию перед публикацией SERVICE_RUNNING и запросить дополнительное время, если необходимо, с помощью SetServiceStatus. - person Ian Goldby; 04.02.2011

Я согласен с Ромуло закончить, чтобы как можно скорее приступить к вашим услугам. Однако, если вам нужно время и вы используете .NET Framework 2.0 или более позднюю версию, вы можете рассмотреть метод ServiceBase.RequestAdditionalTime().

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.requestadditionaltime.aspx

protected override void OnStart()
{
    this.RequestAdditionalTime(10000);
    // do your stuff
}
person Hinek    schedule 26.05.2009
comment
Спасибо, это мне очень помогло! У меня есть старый код, и мне нужно было запустить его... - person Turrau; 22.07.2010
comment
Предупреждение, возможная оговорка: в документации для HostControl.RequestAdditionalTime не указано, что вы можете запрашивать максимум 60 или 120 секунд. В противном случае он игнорирует ваш запрос. (отсюда: stackoverflow.com/questions/19589686/topshelf-timeout-issue, не проверял, но стоит задуматься) - person Frederik Struck-Schøning; 03.01.2018

Просто делайте трудоемкие вещи в другом потоке

   protected override void OnStart(string[] args)
    {
        var task = new Task(() =>
        {
            // Do stuff
        });
        base.OnStart(args);
        task.Start();
    }
person LuckyLikey    schedule 27.05.2015
comment
Вы должны быть осторожны здесь, потому что, если // Do stuff выдает исключение, оно будет проглочено вместо остановки / сбоя службы, что вам действительно может понадобиться, чтобы вы знали, что служба не работает, а не работает, но на самом деле ничего не делает. или работает нормально. - person deadlydog; 07.01.2017

Мне также пришлось иметь дело с сервисом, который может занять несколько секунд/минут, чтобы иметь хороший старт. Когда служба запускается, она пытается подключиться к SQL Server. Однако, когда весь сервер был перезапущен, моя служба запускалась ДО SQL Server. (Я знаю о зависимости службы, но по определенной причине это не относится к моей ситуации....). Я попытался сделать цикл, пытаясь 10 раз подключиться к SQL Server, но Windows убивает мою службу до второй попытки из-за тайм-аута.

Мое решение: я добавил таймер в "onStart()" моей службы. Затем метод службы «onTick()» пытался 10 раз подключиться к SQL Server (с ожиданием в нем 30). Нет больше тайм-аута при запуске.

Итак, в основном,

  • Моя служба начинается через 5 секунд.
  • Таймер запускается через 10 секунд после запуска службы.
  • Таймер пытается 10 раз [ждать 30 секунд каждый раз] для подключения к SQL Server.
  • Если это удастся, таймер отключится сам, если нет (после 10 попыток), я остановлю службу.

Обратите внимание на более элегантный способ решения проблемы, но, возможно, какая-то часть моего решения может помочь кому-то в той же ситуации, что и я,

person Simon    schedule 02.10.2014