/// <summary> /// Evento ocurrido al iniciarse el servicio de windows /// </summary> /// <param name="args">Argumentos de inicio</param> protected override void OnStart(string[] args) { _log.Info($"Iniciado el servicio '{nameof(Win32Service)}'"); #if DEBUG // En depuracion se inicia directamente this.Timer_Tick(null, null); #else // Actualizar el estado del servicio en el ServiceManager de windows a inicio Pendiente ServiceStatus serviceStatus = new ServiceStatus { dwCurrentState = ServiceState.SERVICE_START_PENDING, dwWaitHint = 100000 }; WinApi32Helpers.SetServiceStatus(this.ServiceHandle, ref serviceStatus); // la primera vez que arranca el servicio, se inicia el proceso en la hora especificada de inicio y se guarda el flag // NOTA: si la hora especificada es menor que la hora actual mas el tiempo minimo por defecto, se usa la hora del dia siguiente double interval = (this._processStartTime.TimeOfDay - DateTime.Now.AddMinutes(DEFAULT_FIRST_TIME).TimeOfDay).TotalMinutes; _timer.Interval = 1000 * 60 * ((interval < 0) ? (this._processStartTime.TimeOfDay.Add(new TimeSpan(1, 0, 0, 0)) - DateTime.Now.TimeOfDay).TotalMinutes : interval); _flagFirstStartTime = true; // iniciar el timer _timer.Start(); // Actualizar el estado del servicio en el ServiceManager de windows a ejecutandose serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING; WinApi32Helpers.SetServiceStatus(this.ServiceHandle, ref serviceStatus); #endif }
/// <summary> /// Evento ocurrido al detenerse el servicio de windows /// </summary> protected override void OnStop() { _log.Info($"Detenido el servicio '{nameof(Win32Service)}'"); // Actualizar el estado del servicio en el ServiceManager de windows a inicio Pendiente ServiceStatus serviceStatus = new ServiceStatus { dwCurrentState = ServiceState.SERVICE_START_PENDING, dwWaitHint = 100000 }; WinApi32Helpers.SetServiceStatus(this.ServiceHandle, ref serviceStatus); // detener el timer _timer.Stop(); // Actualizar el estado del servicio en el ServiceManager de windows a ejecutandose serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING; WinApi32Helpers.SetServiceStatus(this.ServiceHandle, ref serviceStatus); }