Таймаут остановки Win-service

203
15 марта 2018, 07:27

Для теста мне нужен сервис который будет останавливаться 10-15 мин.

Я создал свой простейший Win-сервис:

using System;
using System.Diagnostics;
using System.ServiceProcess;
namespace LongService
{   
    public class LongService : ServiceBase
    {
        private EventLog eventLog1;
        public const string MyServiceName = "LongService";
        public const string logName = "LongServiceLog";
        public LongService()
        {
            InitializeComponent();
        }
        private void InitializeComponent()
        {
            this.ServiceName = MyServiceName;
        }
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
        }
        protected override void OnStart(string[] args)
        {
            AddLog("start");
        }
        protected override void OnStop()
        {
            AddLog("stop");
            Process.GetCurrentProcess().WaitForExit(600000);
        }
        public void AddLog(string log)
        {
          try
          {
            if (!EventLog.SourceExists(MyServiceName))
            {
              EventLog.CreateEventSource(MyServiceName, logName);
            }
            eventLog1 = new System.Diagnostics.EventLog();
            eventLog1.Source = MyServiceName;
            eventLog1.Log = logName;            
            eventLog1.WriteEntry(log);
          }
          catch{}
        }

    }
}

Вопрос: как мне правильно отложить(задержать) остановку сервиса с таймаутом в самом сервисе

Process.GetCurrentProcess().WaitForExit(600000);

или как увеличить таймаут в винде в реестре. Т.к. Ожидание остановки сервиса в винде не более 2 мин. через 2 мин винда выкидывает ошибку

  1. служба не ответила на запрос своевременно.
Answer 1

Пишут, что ServiceBase.RequestAdditionalTime может помочь.

ServiceBase.RequestAdditionalTime(TimeSpan.FromMinutes(15)); 

Добавить по вкусу в OnStop/OnStart/OnContinue/OnPause.

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

Да, вот: ServicesPipeTimeout в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control

PS И я не знаю, что вы тестите, но в той же теме совершенно правильно говорится, что нужно при старте/остановке сервиса долгие вещи выносить в отдельный поток.

Answer 2

Ну и пусть выкидывает. Сервису послали команду остановиться, сервис не остановился за время ожидания. Windows выдала предупреждение и забыла об этом сервисе. Пройдут Ваши 10-15 минут и сервис штатно остановится

При останове сервис проходит через статусы SERVICE_RUNNING - SERVICE_STOP_PENDING - SERVICE_STOPPED. PENDING статусы могут висеть сколь угодно долго. Особенности начинаются при работе с зависимыми сервисами. Например, если SERVICE_START_PENDING висит дольше тех же 2 минут, то сервисы, зависимые от этого, не запускаются

READ ALSO
Выполнить Replace по словарю через LINQ

Выполнить Replace по словарю через LINQ

Допустим, есть Dictionary и текст

180
FileStream и пути длинною >260 символов

FileStream и пути длинною >260 символов

Сначала программа валилась на получении списка фалов через DirectoryGetFiles с PathTooLongException

228
Записать в базу текст из динамически созданных textbox- ов

Записать в базу текст из динамически созданных textbox- ов

Одной кнопкой я создаю динамические массивы, введя их количество во второй текстбокс

214
Удаленный сервер возвратил ошибку 403

Удаленный сервер возвратил ошибку 403

Вчера работал над проектом, всё было нормальноСегодня при попытке скачать строку со страницы вылетает исключение

239