windows-services timeout startup

windows services - tiempo de inicio del servicio de Windows



windows-services timeout (4)

¿Hay alguna manera de establecer un valor diferente para el tiempo de espera de inicio del servicio por servicio? Puedo cambiarlo usando la clave de registro ServicesPipeTimeout, pero es por máquina ( http://support.microsoft.com/kb/824344 ).

Por el momento, lo único en lo que pensaba era en hacer todas las acciones de inicio que consumían mucho tiempo en un hilo diferente.


Es una buena práctica terminar de comenzar su servicio lo más rápido posible. Por lo tanto, durante el estado de inicio , haga solo lo que necesita para reconocer que se inició correctamente; y haz el resto más tarde. Si el inicio es un proceso largo, utilice SetServiceStatus periódicamente para informar al Administrador de control de servicios que aún no ha finalizado, por lo que no interrumpe el tiempo de espera de su servicio.


También tuve que lidiar con un servicio que puede tomar unos segundos / minutos para tener un buen comienzo. Cuando se inicia el servicio, intenta conectarse a un servidor SQL. Sin embargo, cuando se reinició todo el servidor, mi servicio comenzaba ANTES de SQL Server. (Sé de la dependencia del Servicio pero no se aplica a mi situación por un motivo en particular ...). Intenté hacer un bucle intentando 10 veces conectarme a SQL Server, pero Windows estaba matando mi servicio antes del segundo intento, debido al tiempo de espera.

Mi solución : agregué un temporizador en "onStart ()" de mi servicio. Luego, el método "onTick ()" del servicio intentaba 10 veces conectarse al Servidor SQL (con una espera de 30 en él). No más tiempo de espera al inicio.

Así que básicamente,

  • Mi servicio comienza en 5 segundos.
  • Se inicia un temporizador 10 segundos después de que se inicia el servicio.
  • El temporizador intenta 10 veces [esperar 30 segundos cada vez] para conectarse al servidor SQL.
  • Si tiene éxito, el temporizador se desactivará, si no (después de 10 intentos), detengo el servicio.

Tenga en cuenta la forma más elegante de resolver el problema, pero tal vez una parte de mi solución pueda ayudar a alguien en la misma situación que yo,



Simplemente haga cosas intensas en tiempo en otro hilo

protected override void OnStart(string[] args) { var task = new Task(() => { // Do stuff }); base.OnStart(args); task.Start(); }