namespace RadeonResetBugFixService.Tasks { using System; using System.ServiceProcess; using Contracts; abstract class AbstractServiceTask : ITask { protected virtual bool ShouldStart(ServiceController serviceInfo) => false; protected virtual bool ShouldStop(ServiceController serviceInfo) => false; public abstract string TaskName { get; } void ITask.Run(ILogger logger) { foreach (var originalService in ServiceController.GetServices()) { string serviceDescription = $"{originalService.DisplayName} ({originalService.ServiceName})"; if (this.ShouldStart(originalService)) { var service = new ServiceController(originalService.ServiceName); if (service.Status == ServiceControllerStatus.Running) { logger.Log($"{serviceDescription} is already running"); } else { if (service.Status != ServiceControllerStatus.StartPending) { logger.Log($"Starting service {serviceDescription}"); service.Start(); logger.Log($"Initiated service start for"); } logger.Log($"Waiting for service {serviceDescription} to start"); service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(30)); if (service.Status == ServiceControllerStatus.Running) { logger.Log($"Service is running"); } else { logger.Log($"Failed; service state is {service.Status}"); } } } else if (this.ShouldStop(originalService)) { var service = new ServiceController(originalService.ServiceName); if (service.Status == ServiceControllerStatus.Stopped) { logger.Log($"{serviceDescription} is already stopped"); } else { if (service.Status != ServiceControllerStatus.StopPending) { logger.Log($"Stopping service {serviceDescription}"); service.Stop(); logger.Log($"Initiated service stop"); } logger.Log($"Waiting for service {serviceDescription} to stop"); service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(15)); if (service.Status == ServiceControllerStatus.Stopped) { logger.Log($"Service is stopped"); } else { logger.Log($"Failed; service state is {service.Status}"); } } } } } } }