<span style="color: #0000ff;">namespace<span style="color: #000000;"> WindowsService.Watch
{
<span style="color: #0000ff;">partial <span style="color: #0000ff;">class<span style="color: #000000;"> ServiceWather : ServiceBase
{
<span style="color: #0000ff;">private <span style="color: #0000ff;">static <span style="color: #0000ff;">string currentExePath = <span style="color: #0000ff;">string<span style="color: #000000;">.Empty;
<span style="color: #0000ff;">public<span style="color: #000000;"> ServiceWather()
{
InitializeComponent();
currentExePath =<span style="color: #000000;"> AppDomain.CurrentDomain.BaseDirectory;
}
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 检查间隔
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #0000ff;">private <span style="color: #0000ff;">static <span style="color: #0000ff;">readonly <span style="color: #0000ff;">int _timerInterval = Convert.ToInt32(ConfigurationManager.AppSettings[<span style="color: #800000;">"<span style="color: #800000;">timerInterval<span style="color: #800000;">"]) * <span style="color: #800080;">1000<span style="color: #000000;">;
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 要守护的服务名
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #0000ff;">private <span style="color: #0000ff;">static <span style="color: #0000ff;">readonly <span style="color: #0000ff;">string toWatchServiceName = ConfigurationManager.AppSettings[<span style="color: #800000;">"<span style="color: #800000;">toWatchServiceName<span style="color: #800000;">"<span style="color: #000000;">];
<span style="color: #0000ff;">private<span style="color: #000000;"> System.Timers.Timer _timer;
<span style="color: #0000ff;">protected <span style="color: #0000ff;">override <span style="color: #0000ff;">void OnStart(<span style="color: #0000ff;">string<span style="color: #000000;">[] args)
{
<span style="color: #008000;">//<span style="color: #008000;">服务启动时开启定时器
_timer = <span style="color: #0000ff;">new<span style="color: #000000;"> System.Timers.Timer();
_timer.Interval =<span style="color: #000000;"> _timerInterval;
_timer.Enabled = <span style="color: #0000ff;">true<span style="color: #000000;">;
_timer.AutoReset = <span style="color: #0000ff;">true<span style="color: #000000;">;
_timer.Elapsed +=<span style="color: #000000;"> _timer_Elapsed;
LogHelper.WriteLog(currentExePath,<span style="color: #800000;">"<span style="color: #800000;">守护服务开启<span style="color: #800000;">"<span style="color: #000000;">);
}
</span><span style="color: #0000ff;">void</span> _timer_Elapsed(<span style="color: #0000ff;">object</span><span style="color: #000000;"> sender,System.Timers.ElapsedEventArgs e)
{
</span><span style="color: #008000;">//</span><span style="color: #008000;">如果服务状态为停止,则重新启动服务</span>
<span style="color: #0000ff;">if</span> (!<span style="color: #000000;">CheckSericeStart(toWatchServiceName))
{
StartService(toWatchServiceName);
}
}
</span><span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">override</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> OnStop()
{
</span><span style="color: #0000ff;">if</span> (_timer != <span style="color: #0000ff;">null</span><span style="color: #000000;">)
{
_timer.Stop();
_timer.Dispose();
LogHelper.WriteLog(currentExePath,</span><span style="color: #800000;">"</span><span style="color: #800000;">守护服务停止</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
}
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 启动服务
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="serviceName"></span><span style="color: #008000;">要启动的服务名称</span><span style="color: #808080;"></param></span>
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> StartService(<span style="color: #0000ff;">string</span><span style="color: #000000;"> serviceName)
{
</span><span style="color: #0000ff;">try</span><span style="color: #000000;">
{
ServiceController[] services </span>=<span style="color: #000000;"> ServiceController.GetServices();
</span><span style="color: #0000ff;">foreach</span> (ServiceController service <span style="color: #0000ff;">in</span><span style="color: #000000;"> services)
{
</span><span style="color: #0000ff;">if</span> (service.ServiceName.Trim() ==<span style="color: #000000;"> serviceName.Trim())
{
service.Start();
</span><span style="color: #008000;">//</span><span style="color: #008000;">直到服务启动</span>
service.WaitForStatus(ServiceControllerStatus.Running,<span style="color: #0000ff;">new</span> TimeSpan(<span style="color: #800080;">0</span>,<span style="color: #800080;">0</span>,<span style="color: #800080;">30</span><span style="color: #000000;">));
LogHelper.WriteLog(currentExePath,</span><span style="color: #0000ff;">string</span>.Format(<span style="color: #800000;">"</span><span style="color: #800000;">启动服务:{0}</span><span style="color: #800000;">"</span><span style="color: #000000;">,serviceName));
}
}
}
</span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception ex)
{
LogHelper.WriteLog(currentExePath,ex);
}
}
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">bool</span> CheckSericeStart(<span style="color: #0000ff;">string</span><span style="color: #000000;"> serviceName)
{
</span><span style="color: #0000ff;">bool</span> result = <span style="color: #0000ff;">true</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">try</span><span style="color: #000000;">
{
ServiceController[] services </span>=<span style="color: #000000;"> ServiceController.GetServices();
</span><span style="color: #0000ff;">foreach</span> (ServiceController service <span style="color: #0000ff;">in</span><span style="color: #000000;"> services)
{
</span><span style="color: #0000ff;">if</span> (service.ServiceName.Trim() ==<span style="color: #000000;"> serviceName.Trim())
{
</span><span style="color: #0000ff;">if</span> ((service.Status ==<span style="color: #000000;"> ServiceControllerStatus.Stopped)
</span>|| (service.Status ==<span style="color: #000000;"> ServiceControllerStatus.StopPending))
{
result </span>= <span style="color: #0000ff;">false</span><span style="color: #000000;">;
}
}
}
}
</span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception ex)
{
LogHelper.WriteLog(currentExePath,ex);
}
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> result;
}
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 停止
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="serviceName"></param></span>
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> StopService(<span style="color: #0000ff;">string</span><span style="color: #000000;"> serviceName)
{
</span><span style="color: #0000ff;">try</span><span style="color: #000000;">
{
ServiceController[] services </span>=<span style="color: #000000;"> ServiceController.GetServices();
</span><span style="color: #0000ff;">foreach</span> (ServiceController service <span style="color: #0000ff;">in</span><span style="color: #000000;"> services)
{
</span><span style="color: #0000ff;">if</span> (service.ServiceName.Trim() ==<span style="color: #000000;"> serviceName.Trim())
{
service.Stop();
</span><span style="color: #008000;">//</span><span style="color: #008000;">直到服务停止</span>
service.WaitForStatus(ServiceControllerStatus.Stopped,ex);
}
}
}
}