循环 if 语句以在失败时重新启动服务

Looping the if statement to restart a service in case of failure

我有一个代码,我正在检查我在方法中作为参数传递的服务是否是 运行 然后停止它并以 10 秒的间隔启动它,基本上它只是重新启动方法。但是,是否可以使用带有计时器的循环,以便在停止后如果服务没有启动,继续尝试重新启动,直到 运行 再次返回。

我使用的库是System.ServiceProcess

这是我目前使用的方法。

public static bool RestartService(string serviceName)
{
    bool result = false;
    using (ServiceController controller = new ServiceController(serviceName))
    {
        try
        {
            if (controller.Status != ServiceControllerStatus.Stopped)
            {
                controller.Stop();
                controller.WaitForStatus(ServiceControllerStatus.Stopped,
                    TimeSpan.FromSeconds(10));
            }

            if (controller.Status != ServiceControllerStatus.Running)
            {
                controller.Start();
                controller.WaitForStatus(ServiceControllerStatus.Running,
                    TimeSpan.FromSeconds(10));
            }

            if (controller.Status == ServiceControllerStatus.Running)
            {
                result = true;
            }
        }
        catch (Exception ex)
        {
            _logger.Error($"RestartService {serviceName} failed, 
                exception_message: {ex.Message}");
        }
    }

    return result;
}

是否可以使用带计时器的循环,以便在服务未启动时停止后继续尝试重新启动,直到 运行 再次返回。

可以从 Timer 调用该方法(这可能是个好主意,以便它在后台运行)。

将您的代码转换为重试直到成功就像将 if 更改为 while 一样简单:

public static bool RestartService(string serviceName)
{
    bool result = false;
    using (ServiceController controller = new ServiceController(serviceName))
    {
        try
        {
            while (controller.Status != ServiceControllerStatus.Stopped)
            {
                controller.Stop();
                controller.WaitForStatus(ServiceControllerStatus.Stopped,
                    TimeSpan.FromSeconds(10));
            }

            while (controller.Status != ServiceControllerStatus.Running)
            {
                controller.Start();
                controller.WaitForStatus(ServiceControllerStatus.Running,
                    TimeSpan.FromSeconds(10));
            }

            result = true;
        }
        catch (Exception ex)
        {
            _logger.Error($"RestartService {serviceName} failed, 
                exception_message: {ex.Message}");
        }
    }

    return result;
}