Подтвердить что ты не робот

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

Я написал службу windows в С#, которая обрабатывает много данных. когда мы остановим его, попробуйте на время 20/30 секунд и затем выберем исключение.

Я хочу реализовать ServiceBase.RequestAdditionalTime() в событии OnStop.

Я хочу узнать точное время ожидания, после которого служба Windows генерирует исключение, поэтому я могу запросить дополнительное время перед этим.

Я искал, но не нашел это значение времени ожидания останова по умолчанию.

4b9b3361

Ответ 1

Я написал следующий код для его достижения.

protected override void OnStop()
{
  int timeout = 10000;
  var task = Task.Factory.StartNew(() => MyTask());
  while (!task.Wait(timeout))
  {
      RequestAdditionalTime(timeout);
  }
}

Приведенный выше код запускает задачу в параллель с основным потоком (запуск задачи сразу же), следующая строка - проверка завершения задачи или не каждые 10 секунд, и если она не завершена, она запрашивает дополнительные 10 секунд и продолжает проверять до завершения задачи.

Ответ 2

Хотя многие люди упомянули раздел реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeout, в соответствии с этот "обработчик управления сервисом" из Microsoft, этот реестр только управляет максимальным количеством времени, которое может выполнить служба для закрытия , когда сама Windows выключается или перезапускается:

<... > , чтобы предотвратить остановку службы при остановке, существует ограничение как долго сервисный контроллер ждет. Если услуга закрыта вниз через оснастку "Службы", предел составляет 125 секунд. Если операционная система перезагружается, ограничение времени указано в WaitToKillServiceTimeout значение <... >

Если Windows не находится в процессе перезапуска или выключения, то время ожидания по умолчанию Windows будет ждать завершения работы службы 30 секунд. Тем не менее, приложения могут запрашивать дополнительное время, которое будет выполняться до 125 секунд (суммируется по всем запросам).

В Windows Server 2003 и более поздних версиях этот таймаут по умолчанию можно изменить с помощью раздела реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServicesPipeTimeout, как описано в эту статью поддержки Microsoftэтот вопрос ServerFault). Неясно, относится ли это к Windows 7/8/10, поскольку в статье упоминаются только версии сервера.

Если на компьютере было инициировано перезапуск/завершение работы, значение ключа реестра WaitToKillServiceTimeout (если присутствует) указывает максимальное время, в течение которого Windows разрешает приложению разрешать, переопределяя ОС по умолчанию,

Предположительно, это так, что приложения не могут произвольно задерживать выключение за пределами по умолчанию (или то, что администратор указал через запись реестра WaitToKillServiceTimeout).

Ответ 3

Он установлен в разделе реестра:

 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control

со строковым значением WaitToKillServiceTimeout. Если не определено, значение по умолчанию равно 20000 (мс). На моей машине, похоже, установлено значение 12000 (12 секунд). Я никогда не касался этого.

Ответ 4

по умолчанию я считаю, что это 12000 миллисекунд, чтобы изменить его, вам нужно получить доступ к реестру HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeout и измените значение

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

TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);

и здесь вы определяете свой собственный тайм-аут для остановки

 TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
 service.Stop();
 service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

Ответ 5

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