Для теста мне нужен сервис который будет останавливаться 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 мин винда выкидывает ошибку
Пишут, что ServiceBase.RequestAdditionalTime может помочь.
ServiceBase.RequestAdditionalTime(TimeSpan.FromMinutes(15));
Добавить по вкусу в OnStop/OnStart/OnContinue/OnPause.
Я рецепт не проверял, возможно, что есть настройки в ОС, которые ограничивают добавочное время.
Да, вот: ServicesPipeTimeout в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
PS И я не знаю, что вы тестите, но в той же теме совершенно правильно говорится, что нужно при старте/остановке сервиса долгие вещи выносить в отдельный поток.
Ну и пусть выкидывает. Сервису послали команду остановиться, сервис не остановился за время ожидания. Windows выдала предупреждение и забыла об этом сервисе. Пройдут Ваши 10-15 минут и сервис штатно остановится
При останове сервис проходит через статусы SERVICE_RUNNING
- SERVICE_STOP_PENDING
- SERVICE_STOPPED
. PENDING статусы могут висеть сколь угодно долго. Особенности начинаются при работе с зависимыми сервисами. Например, если SERVICE_START_PENDING
висит дольше тех же 2 минут, то сервисы, зависимые от этого, не запускаются
Виртуальный выделенный сервер (VDS) становится отличным выбором
Сначала программа валилась на получении списка фалов через DirectoryGetFiles с PathTooLongException
Одной кнопкой я создаю динамические массивы, введя их количество во второй текстбокс
Вчера работал над проектом, всё было нормальноСегодня при попытке скачать строку со страницы вылетает исключение