保证依赖的服务已全部启动
1.功能介绍:
保证配置文件中,设置的服务已全部启动;未启动的服务,以异常日志的形式记录。
2.设计思路:
Step1:配置文件设置需要默认启动的服务名称
Step2:声明一个服务类对象sc,并从配置文件中的文件名读取出来放于数组depenentServiceArray当中
Step3:遍历服务名称集合。若服务未启动,则启动该服务,并记录日志;若服务异常,则记录服务异常日志
Step4:判断服务是否全部启动。若没有全部启动,则线程休眠规定时间,再次循环,直到服务成功启动;若完成启动,则退出
3.ServiceController 介绍:
定义:可以使用 ServiceController 类连接到现有服务并控制其行为,当创建 ServiceController 类的实例时,设置其属性,以便它与特定的 Windows 服务交互作用。然后可以使用此类来启动、停止和以其他方式操作该服务。
创建 ServiceController 的实例后,必须为其设置两个属性来标识与其交互的服务:计算机名称和要控制的服务的名称。
4.代码片段:
public class ServiceProcessorUtil { public static void CheckDependentServiceAndWait() { string dependentServices = ConfigurationManager.AppSettings["DependentServices"]; //从配置文件读取依赖服务集 if (!string.IsNullOrEmpty(dependentServices)) { bool success; System.ServiceProcess.ServiceController sc; string[] depenentServiceArray = dependentServices.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); while (true) { success = true; foreach (string serviceName in depenentServiceArray) //遍历依赖的服务集 { sc = new System.ServiceProcess.ServiceController(serviceName); //初始化计算机上与服务有关的类 if (sc != null) { try { if (sc.Status != System.ServiceProcess.ServiceControllerStatus.Running) { sc.Start(); //ExceptionUtil:异常处理公共方法 ExceptionUtil.WriteLog(new Exception("依赖的服务:" + serviceName + "不存在或未正常运行")); success = false; break; } } catch { ExceptionUtil.WriteLog(new Exception("依赖的服务:" + serviceName + "未正常运行")); success = false; break; } } else { ExceptionUtil.WriteLog(new Exception("依赖的服务:" + serviceName + "不存在")); success = false; break; } sc.Close(); sc.Dispose(); } if (success) { break; } else { Thread.Sleep(Convert.ToInt16(ConfigurationManage.AppSettings["ThreadSleepTime"]) * 1000); } } } } }