visual studio servicio create crear c# .net windows-services

c# - servicio - windows service visual studio 2015



¿Cuál es el tiempo máximo de espera de servicio de Windows para procesar la solicitud de detención y cómo solicitar tiempo adicional? (5)

Aunque varias personas han mencionado la clave de registro HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/WaitToKillServiceTimeout , de acuerdo con este artículo del "Controlador de control de servicio" de Microsoft, la entrada de registro solo controla el tiempo máximo que un servicio puede tomar para cerrar cuando Windows sí se está cerrando o reiniciando :

<...> para evitar que un servicio detenga el cierre, hay un límite en cuanto al tiempo que espera el controlador del servicio. Si el servicio se está cerrando a través del complemento Servicios, el límite es de 125 segundos. Si el sistema operativo se está reiniciando, el límite de tiempo se especifica en el valor de WaitToKillServiceTimeout <...>

Si Windows no está en el proceso de reiniciar o apagar , entonces la cantidad predeterminada de tiempo que esperará a que se cierre un servicio es de 30 segundos. Sin embargo, las aplicaciones pueden realizar solicitudes de tiempo adicional, que se respetarán hasta un total de 125 segundos (sumadas en todas las solicitudes).

En Windows Server 2003 y versiones posteriores, este tiempo de espera predeterminado se puede cambiar a través de la clave de registro HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/ServicesPipeTimeout , como se describe en este artículo de soporte de Microsoft (y en esta pregunta de ServerFault ). No está claro si esto se aplica a Windows 7/8/10, ya que el artículo solo menciona las versiones del servidor.

Si se ha iniciado un reinicio / apagado en la máquina, el valor de la clave de registro WaitToKillServiceTimeout (si está presente) especifica la cantidad máxima de tiempo que Windows permitirá que se permita la aplicación, anulando el valor predeterminado del sistema operativo.

Es de suponer que esto es así para que las aplicaciones no puedan retrasar arbitrariamente el cierre más allá del valor predeterminado (o lo que el administrador especificó a través de la entrada de registro WaitToKillServiceTimeout).

He escrito un servicio de Windows en c # que procesa muchos datos. cuando lo paremos, inténtalo durante 20/30 segundos y luego lanza la excepción.

Quiero implementar ServiceBase.RequestAdditionalTime () en el evento OnStop.

Quiero saber el tiempo de espera exacto después del cual el servicio de Windows lanza la excepción, para poder solicitar un tiempo adicional justo antes.

Busqué pero no encontré este valor predeterminado de tiempo de espera de parada.


Escribí el siguiente código para lograrlo.

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

El código anterior inicia una Tarea en paralelo al subproceso principal (la Tarea comienza a ejecutarse inmediatamente), la siguiente línea es verificar si la tarea se completa o no cada 10 segundos y si no se completa, solicita 10 segundos adicionales y continúa revisando hasta que la tarea se obtenga terminado.


Se establece en el registro en la subclave:

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control

con el valor de cadena WaitToKillServiceTimeout . Si no se define, el valor predeterminado es 20000 (ms). En mi máquina parece estar configurado en 12000 (12s). Nunca lo he tocado.


Simplemente siempre realice el RequestAdditionalTime , con el tiempo máximo que espera que su servicio necesite para el cierre. No es un error terminar antes de lo previsto.


por defecto, creo que son 12000 milisegundos, para cambiarlo necesita acceder al registro HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Control / WaitToKillServiceTimeout y cambiar el valor

pero puede definir su propio tiempo de espera si desea comenzar o detener la programación aquí, puede definir su propio tiempo de espera para comenzar

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

y aquí usted define su propio tiempo de espera para parar

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